์ด์ ๊ธ์์ ์์์ ์ฌ์ฉํ์ ๋ ์บก์ํ๊ฐ ๊นจ์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ฐฉ๋ฒ์ด ์์๊น์?
๋ฐ๋ก, ์์ ๋์ ๊ตฌ์ฑ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
๐ค 1. ๊ตฌ์ฑ?
์์์์ ๊ตฌ์ฑ์ผ๋ก ์ ํํ๋ ๋ฐฉ๋ฒ์, ๋ถ๋ชจ ํด๋์ค๋ฅผ extends ํ๋ ๊ฒ์ด ์๋๋ผ ์์ ํด๋์ค ๋ถ๋ถ์ private ๋ฉค๋ฒ ๋ณ์๋ก ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์๋ฏธํฉ๋๋ค.
class Base {}
/* ์์ */
class Child extends Base {
private int code;
}
/* ๊ตฌ์ฑ */
class CompositionObject{
private Base base;
private int code;
}
์์์ ๋ฌธ์ ๋, ์์ ํด๋์ค์ ๊ฐํ๊ฒ ์์กด ๊ฒฐํฉ๋๊ธฐ ๋๋ฌธ์ ์์ ํด๋์ค์ ๋ฉค๋ฒ ๋ณ์์ ํ์ ๋ณ๊ฒฝ, ๋ฉ์๋ ์ฌ์ ์ ํน์ ์๋ก์ด ๋ฉ์๋ ์์ฑ์ ๊ฒฐ๊ณผ๋ก ํฐ ์ค๋ฅ๋ฅผ ๋ฒํ ์ ์์ต๋๋ค.
๊ตฌ์ฑ์ ์ฌ์ฉํ๊ฒ ๋๋ฉด, ๋ฉค๋ฒ ๋ณ์๋ก ํด๋น ์ธ์คํด์ค๋ฅผ ๊ฐ๊ณ ๋ฉ์๋ ํธ์ถ์ ์ฌ์ฉํฉ๋๋ค.
๋ฐ๋ผ์ ์์ ํด๋์ค์ ๋ด์ฉ์ด ๋ฐ๋๋๋ผ๋ ๋ฉ์๋ ํธ์ถ์ ํตํ ๊ฐ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์ค๋ฅ๋ฅผ ํํผํ ์ ์์ต๋๋ค.
์์ ์ฝ๋๋ฅผ ํตํด์ ํ์ธํฉ์๋ค.
/* ๋ณ๊ฒฝ ์ */
public class Lotto {
protected List<Integer> lottoNumbers;
public Lotto(List<Integer> lottoNumbers) {
this.lottoNumbers = new ArrayList<>(lottoNumbers);
}
public boolean contains(Integer integer) {
return this.lottoNumbers.contains(integer);
}
...
}
public class WinningLotto extends Lotto {
private final BonusBall bonusBall;
public WinningLotto(List<Integer> lottoNumbers, BonusBall bonusBall) {
super(lottoNumbers);
this.bonusBall = bonusBall;
}
public long compare(Lotto lotto) {
return lottoNumbers.stream()
.filter(lotto::contains)
.count();
}
...
}
/* ๋ณ๊ฒฝ ํ */
public class Lotto {
protected int[] lottoNumbers; // ํ์
๋ณ๊ฒฝ๋จ!
public Lotto(int[] lottoNumbers) {
this.lottoNumbers = lottoNumbers;
}
public boolean contains(Integer integer) {
return Arrays.stream(lottoNumbers)
.anyMatch(lottoNumber -> Objects.equals(lottoNumber, integer));
// ๋ฉ์๋ ๋ด์ฉ ๋ณ๊ฒฝ๋จ!
}
...
}
public class WinningLotto extends Lotto {
private final BonusBall bonusBall;
// ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. (ํ์
์๋ฌ)
public WinningLotto(List<Integer> lottoNumbers, BonusBall bonusBall) {
super(lottoNumbers);
this.bonusBall = bonusBall;
}
// ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. (int[]์๋ .stream()์ด ์์.)
public long compare(Lotto lotto) {
return lottoNumbers.stream()
.filter(lotto::contains)
.count();
}
}
์์์ ์ฌ์ฉํ ๊ฒฝ์ฐ์ ๋๋ค.
๋ณ๊ฒฝ ์ ๊ณผ ํ์ ์ฐจ์ด๋, Lotto ํด๋์ค์ ๋ฉค๋ฒ ๋ณ์์ธ lottoNumbers์ ํ์ ์ List<Integer>์์ int[]๋ก ๋ณ๊ฒฝํ๊ณ , ํด๋น ํ์ ๋ณ๊ฒฝ์ ๋ง์ถฐ contains์ ๋ก์ง์ ๋ณ๊ฒฝํ๋ค๋ ๊ฒ ์ ๋๋ค.
Lotto๋ฅผ ์์๋ฐ๊ณ ์๋ WinningLotto๋ ๋ถ๋ชจ์ธ Lotto์ ๊ฐํ๊ฒ ์์กด ๋ฐ ๊ฒฐํฉ์ ํ๊ณ ์์ด์ ๊ทธ๋๋ก ์์ฑ์ ๋ฐ compare ํจ์์์ ์๋ฌ๊ฐ ๋๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฌ๋, ๊ตฌ์ฑ์ ์ฌ์ฉํ๋ฉด ์ด๋จ๊น์?
/* ๋ณ๊ฒฝ ์ */
public class Lotto {
protected List<Integer> lottoNumbers;
public Lotto(List<Integer> lottoNumbers) {
this.lottoNumbers = new ArrayList<>(lottoNumbers);
}
public boolean contains(Integer integer) {
return this.lottoNumbers.contains(integer);
}
public boolean compare(Lotto otherLotto){
... ์๋ต
}
}
/* ๋ณ๊ฒฝ ํ */
public class Lotto {
protected int[] lottoNumbers;
public Lotto(int[] lottoNumbers) {
this.lottoNumbers = lottoNumbers;
}
public boolean contains(Integer integer) {
return Arrays.stream(lottoNumbers)
.anyMatch(lottoNumber -> Objects.equals(lottoNumber, integer));
}
public boolean compare(Lotto otherLotto){
... ์๋ต
}
}
/* ๊ตฌ์ฑ ์ฌ์ฉ */
public class WinningLotto {
private Lotto lotto;
private BonusBall bonusBall;
}
๊ตฌ์ฑ์ ์ฌ์ฉํ๊ฒ ๋๋ฉด, ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ์บก์ํ๋ฅผ ๊นจํธ๋ฆฌ์ง ์์ต๋๋ค.
๋ํ ๊ธฐ์กด ํด๋์ค์ ๋ํ ์ํฅ์ด ์ ์ด์ง๋ฉฐ, ์์ ํด์ง๋๋ค.
๋ฌผ๋ก , WinningLotto์์ compare ๋ฉ์๋๋ฅผ ๊ตฌ์ฑํ๋ฉด ์ํฅ์ด ์์ ์ ์๊ธฐ ๋๋ฌธ์ Lotto ํด๋์ค ๋ด๋ถ๋ก compare ํจ์๋ฅผ ์ฎ๊ฒผ์ต๋๋ค.
์ด๋ฐ ๋ฐฉ์์ด๋ผ๋ฉด, ํ์ ์ด List<Integer>์์ int[]๋ก ๋ณ๊ฒฝ๋๋๋ผ๋ Lotto์ ๋ฉ์๋ ํธ์ถ์ ํตํ ๊ฐ๋ง ํ์ฉํ๋ฉด ๋๋ฏ๋ก WinningLotto ํด๋์ค๋ ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค.
์๊ธฐ ์์ ์ ์ฐธ์กฐ๋ฅผ ๋๊ฒจ ๋์ค์ ๋ค์ ๋๋ ค ๋ฐ๋ ์ฝ๋ฐฑ(call-back) ํ๋ ์์ํฌ์๋ ๊ตฌ์ฑ์ด ์ ํฉํ์ง ์์ผ๋, ์ด ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋ ์์๋ณด๋จ ๊ตฌ์ฑ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค๊ณ ํฉ๋๋ค.
'โ ์๋ฐ : JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Effective Java] ์์ฑ์ ๋์ ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋ ์ฌ์ฉํ๊ธฐ (0) | 2023.01.06 |
---|---|
[Java] ์๋ฐ ์ง๋ ฌํ (Serialization) (1) | 2023.01.06 |
[Java] ์์์ ์ฅ๋จ์ , ์์์ ์ธ์ ์จ์ผ ํ๋๊ฐ? (1) | 2022.12.07 |
[Java] ์์(Inheritance) ์ฌ์ฉ๋ฒ๊ณผ ์์์ ์ฌ์ฉํ๋ ์ด์ (0) | 2022.12.06 |