Development
์์์ด ์ํฐํจํด์ด๋ผ๊ณ ?
8/14/2024

ํญ๊ฐ์๋ ์์์ด ์ํฐํจํด์ด๋ฉฐ, ์ฌ์ฉ์ ํ์ง ์์์ผ ํ๋ค๋ ์๊ธฐ๋ ๋ค๋ฆฌ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ์ด๋ฌํ ๋ง์ ์ด๋ค ์ํฉ์์ ๋์์๊น์?
InstrumentedHashSet ์์ ๋ก ์์๋ณด๋ ์์์ ๋ฌธ์ ์
InstrumentedHashSet ๊ตฌํํ๊ธฐ
InstrumentedHashSet์ ์ ํฌ๊ฐ ๋ง๋ค๊ณ ์ ํ๋ ์๋ก์ด ํด๋์ค๋ก, HashSet์ ์์ํ์ฌ ๊ทธ ๊ธฐ๋ฅ์ ๋ชจ๋ ์ฌ์ฉํจ๊ณผ ๋์์ ๊ฐ์ฒด๊ฐ ์์ฑ๋ ์ดํ ๋ช๊ฐ์ ์์๊ฐ ์ถ๊ฐ๋์๋์ง ์ธก์ ํ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐ๋ก ์ ๊ณตํฉ๋๋ค. ๊ตฌํ๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
public class InstrumentedHashSet<E> extends HashSet<E> {
private int addCount = 0;
@Override
public boolean add(E e) {
addCount++;
return super.add(e);
}
@Override
public boolean addAll(java.util.Collection<? extends E> c) {
addCount += c.size();
return super.addAll(c);
}
public int getAddCount() {
return addCount;
}
}HashSet์ ์์๋ฐ์ ๋ค ํน์ ๊ธฐ๋ฅ์ ์ค๋ฒ๋ผ์ด๋ฉํ์ฌ ๊ธฐ๋ฅ์ ํ์ฅํ๊ณ ์ ํฉ๋๋ค.addCount๋ ์ถ๊ฐ๋ ์์์ ๊ฐ์๋ฅผ ๊ธฐ๋กํ๋ ํ๋์
๋๋ค. Set์ ํตํด ์์๋ฅผ ์ถ๊ฐํ๋ ๋ฉ์๋๋ add(), addAll() ๋ ๊ฐ์ง ๋ฟ์ด๋ฏ๋ก, ์ด ๋ฉ์๋๋ค์ ์ค๋ฒ๋ผ์ด๋ฉํ์ฌ ์์๊ฐ ์ถ๊ฐ๋ ๊ฐ์๋ฅผ ๊ด๋ฆฌํ๋๋ก ๋ง๋ค์์ต๋๋ค.๋ค์์ ์ ๊ธฐ๋ฅ์ด ์๋๋๋ก ๋์ํ๋์ง ํ
์คํธํ๋ ์ฝ๋์
๋๋ค.
class InstrumentedHashSetTest {
@Test
void testAddCount() {
InstrumentedHashSet<Integer> set = new InstrumentedHashSet<>();
set.add(1);
set.add(2);
set.addAll(List.of(3, 4, 5));
Assertions.assertEquals(5, set.getAddCount());
}
}์ ์ฝ๋๋ฅผ ์ํ์ํค๋ฉด addCount์ ๊ฐ์ผ๋ก 5๋ฅผ ๊ธฐ๋ํ์ง๋ง ์ค์ ๊ฐ์ 8์ด ๋์๋ค๋ฉฐ ํ
์คํธ๊ฐ ์คํจํ๊ฒ ๋ฉ๋๋ค. ์ด๋ป๊ฒ ์ด๋ฐ์ผ์ด ๋ฐ์ํ๊ฒ ๋ ๊ฑธ๊น์? ๋๋์ฒด ์?
๋ฌธ์ ์ ์์ธ์โฆ
๋ฌธ์ ์ ์์ธ์ ๋ด๋ถ์ ์ผ๋ก addAll ๋ฉ์๋๊ฐ add ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋์ด์๊ธฐ ๋๋ฌธ์
๋๋ค.
public boolean addAll(Collection<? extends E> c) {
boolean modified = false;
for (E e : c)
if (add(e))
modified = true;
return modified;
}์ ์ฝ๋๋ InstrumentedHashSet์ ์์ ํ์
์ธ HashSet์ ์์ ํ์
์ธ AbstractHashSet์ ์์ ํ์
์ธ AbstractCollection์ ๊ตฌํ๋์ด์๋ ๋ด์ฉ์ผ๋ก, InstrumentHashSet์ addAll์ ์ ์ฝ๋๋ฅผ ์ํํฉ๋๋ค. ๋ฐ๋ผ์ ๊ฒฐ๊ตญ ์ค๋ฒ๋ผ์ด๋ฉ์ ํตํด add๊ฐ ๋ค์ ํธ์ถ๋๋ฉด์ addCount๋ฅผ ์ค๋ณตํ์ฌ ์ฆ๊ฐ์ํค๊ฒ ๋ฉ๋๋ค. ๊ฒฐ๊ตญ ์ฐ๋ฆฌ์ ์ฝ๋๊ฐ ์ ์๋๋๋ก ๋์ํ์ง ์๋์ง๋ฅผ ํ์ธํ๋ ค๋ฉด ๊ทธ ์์ ํด๋์ค์ ๋ชจ๋ ๋ถ๋ถ์ ํ์ธํ์ฌ ์ค์ง์ ์ผ๋ก ์ํ๋๋ ์ฝ๋๋ฅผ ํ์ธํด์ผํ ํ์๊ฐ ์์ต๋๋ค.
๊ทธ๋ผ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์๋ ์ด๋ค ๊ฒ์ด ์์๊น์? ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ addAll์ ์ฌ์ ์ํ ๋ถ๋ถ์์ addCount๋ฅผ ์ฆ๊ฐ์ํค๋ ๋ถ๋ถ์ ์์ ๋ ๊ฒ์
๋๋ค. addCount๋ฅผ ๋๋ ค์ฃผ๋ ๋ถ๋ถ์ ์์ค๋ค๋ฉด ์ค๋ฒ๋ผ์ด๋ฉ ํ ํ์ ์์ฒด๊ฐ ์์ด์ง๋ฏ๋ก InstrumentedHashSet์์ addAll์ ์ค๋ฒ๋ผ์ด๋ฉํ๋ ๋ฉ์๋ ์์ฒด๋ฅผ ์์จ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ๋ณ๊ฒฝํ ๊ฒฝ์ฐ ํ
์คํธ ์ฝ๋๋ ํต๊ณผํฉ๋๋ค.
public class InstrumentedHashSet<E> extends HashSet<E> {
private int addCount = 0;
@Override
public boolean add(E e) {
addCount++;
return super.add(e);
}
public int getAddCount() {
return addCount;
}
}ํ์ง๋ง ์ด๋ฌํ ํด๊ฒฐ๋ฒ์ ๋ณธ์ง์ ์ธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ฃผ์ง๋ ๋ชปํฉ๋๋ค. ๊ทธ ์ด์ ๋ ์๋ธํ์
์ธ InstrumentedHashSet์ ๋์์ด ์ํผํ์
์ธ AbstractionCollection์ ๋์ ๋ด์ฉ์ ์ํฅ์ ๋ฐ๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด๋ฌํ ํด๊ฒฐ๋ฒ์ โ์๋ธํด๋์ค์ ๊ตฌํ์ด ์ํผํด๋์ค์ ๊ตฌํ์ ์์กดํ๋คโ๋ผ๊ณ ํํํฉ๋๋ค. AbstractionCollection์ ์์ ๊ฐ์ addAll์ ๊ตฌํ์ ๋ค์ ๋ฆด๋ฆฌ์ฆ์์ add๋ฅผ ํธ์ถํ์ง ์๋ ๋ฐฉ์์ผ๋ก ๋ฐ๋์ง๋ ๋ชจ๋ฆ
๋๋ค. ์ด๋ ๊ฒ ๋ฐ๋๊ฒ ๋ ๊ฒฝ์ฐ ์ ํด๊ฒฐ์ฑ
์ ๊นจ์ง๊ฒ ๋๊ณ , ์๋กญ๊ฒ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ ๊ฒ์
๋๋ค. ๋ง์ฝ ์์ ํด๋์ค์ ๋ณ๊ฒฝ ์ดํ ํ์ ํด๋์ค์ ํ
์คํธ๊ฐ ์ํ๋์ง ์๋๋ค๋ฉด ๋ก์ง์ด ๊นจ์ก์์ ๊นจ๋ซ์ง ๋ชปํ ์ํ๋ก ์ด์ ์ฝ๋๊ฐ ๋์๊ฐ ์ฌ์ง๋ ์กด์ฌํฉ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ํด๊ฒฐํ ์ ์์ง ์์๊น? ๋ ๋ค๋ฅธ ์ค๋ฒ๋ผ์ด๋ฉ ๋ฐฉ๋ฒ
์ ์ํฉ์์๋ InstrumentedHashSet์ ๋์์ด addAll์ ๋ด๋ถ ๊ตฌํ์ ์์กดํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณ๊ฒ ๋์์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํด๋ณด๋ฉด ์ด๋จ๊น์?
public class InstrumentedHashSet<E> extends HashSet<E> {
private int addCount = 0;
@Override
public boolean add(E e) {
addCount++;
return super.add(e);
}
@Override
public boolean addAll(java.util.Collection<? extends E> c) {
boolean modified = false;
for (E e : c)
if (add(e))
modified = true;
return modified;
}
public int getAddCount() {
return addCount;
}
}InstrumentedHashSet์ addAll์ ๊ตฌํ์ ์ํผํด๋์ค์ ์์ํ์ง ์๊ณ , ์ด ํด๋์ค ๋ด์์ ๊ตฌํํ์ต๋๋ค. ์ด์ ๋ ์ํผํด๋์ค์ ๋ก์ง์ด ๋ฐ๋์ด๋ ํด๋น ๋ก์ง์ ์์กดํ์ง ์์ผ๋ฏ๋ก InstrumentedHashSet์ ์ ์์ ์ผ๋ก ๋์ํ ๊ฒ์
๋๋ค. ์ด ์ฝ๋๋ ๊ทธ๋ผ ๋ฌธ์ ๊ฐ ์์๊น์? ์ด ๋ฐฉ๋ฒ์ ์กฐ๊ธ ๋ค๋ฅธ ๊ฒฐ์ ๋ฌธ์ ์ ์ ๋ณ์ต๋๋ค.
์ด ๋ฐฉ๋ฒ์ ์์ ํด๋์ค์ ๋ฉ์๋ ๋์์ ๋ค์ ๊ตฌํํ๋ ๊ณผ์ ์ด๋ฏ๋ก ์ฝ๋์ ์ค๋ณต์ด ๋ฐ์ํ์ฌ ๋ณ๊ฒฝ์ ํ์๊ฐ ์๊ธธ ๋ ๋ ์ง์ ์ ๋ณ๊ฒฝํด์ผํ๋ค๋ ๋ฌธ์ ๋ฅผ ๊ฐ์ต๋๋ค. ๋ํ ์๋ก์ด ๋ฉ์๋๋ฅผ ๊ด๋ฆฌํด์ผํ๋ค๋ ์ฐจ์์์ ๋ถ๊ฐ์ ์ธ ์๊ฐ๊ณผ ๋ ธ๋ ฅ์ ํ์๋ก ํ ์ ์๊ณ , ์์นซ ์ค๋ฅ๋ฅผ ๋ผ ๊ฐ๋ฅ์ฑ๋ ์กด์ฌํฉ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ํญ์ ์ฌ์ฉ๋ ์ ์๋ ๊ฒ๋ ์๋๋ฐ, ๊ทธ ์ด์ ๋ ์ํผํด๋์ค์ ๊ตฌํ์ด ํด๋น ํด๋์ค์ private ํ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด๋ฅผ ๊ทธ๋๋ก ์ฎ๊ธธ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ํ ์ค๋ฒ๋ผ์ด๋ฉ์ ํตํ ๋ฐฉ๋ฒ์ผ๋ก๋ ์ค๋ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ฐ๋ก ์์ ํด๋์ค์์ add, addAll์ด ์๋ ์๋ก์ด ์์๋ฅผ ๋ฃ๋ ๋ฉ์๋๋ฅผ ์์ฑํ์ ๋, ์ด ๋ฉ์๋๋ฅผ ํตํด ์ ์ฅ๋ ์์๋ ์์ฑ๋ ๊ฐ์์ ํฌํจ๋์ง ์์ ๊ฒ์ด๋ฏ๋ก ํด๋์ค์ ์ ํฉ์ฑ์ด ๊นจ์ง ๊ฒ์
๋๋ค. ์ด ๋ InstrumentedHashSet ์ธก์์ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์ก์ ์ ์๋ ์ฅ์น๋ ์กด์ฌํ์ง ์์ต๋๋ค.
์์๊ณผ ์ค๋ฒ๋ผ์ด๋ฉ์ ํ๊ณ
๊ฒฐ๊ตญ ์ ๋ชจ๋ ๋ฌธ์ ๋ค์ ์๋ก์ด ๊ธฐ๋ฅํ์ฅ์ ์์๊ณผ ์ค๋ฒ๋ผ์ด๋ฉ์ผ๋ก ํ๊ธฐ ๋๋ฌธ์ ์๊ธฐ๋ ๋ฌธ์ ๋ค์ ๋๋ค. ํด๋์ค์ ์์์ ์ํผํด๋์ค๊ณผ ์๋ธํด๋์ค๊ฐ์ ๊ฐํ ๊ฒฐํฉ์ ๋ง๋ค์ด ๋ด์ด, ์ํผํด๋์ค ์ธก์ ๋ณ๊ฒฝ์ด ๋ชจ๋ ์๋ธํด๋์ค์ ์ํฅ์ ์ฃผ๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๊ฐ๊ฐ์ ํด๋์ค๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์งํํ๋ ๊ณผ์ ์์ ๋ค๋ฅธ ํด๋์ค์ ๋์์ ์ํฅ์ ์ฃผ์ด ์ปดํ์ผ ์๋ฌ๋ฅผ ๋ด๊ฑฐ๋ ์ ํฉ์ฑ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๊ธฐ ์ฝ์ต๋๋ค.
Composition์ ํตํ ํด๊ฒฐ
์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ ์ค ํ๋๋ Composition(์กฐํฉ, ํฉ์ฑ)์ด๋ผ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. Composition์ ์ฌ์ฉํ๊ณ ์ ํ๋ ๊ธฐ๋ฅ์ ์ง ํด๋์ค๋ฅผ private ํ๋๋ก ๊ฐ์ง๊ณ ์์ผ๋ฉด์, ์ด๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค. ์ฝ๋๋ฅผ ๋จผ์ ๋ณด๊ฒ ์ต๋๋ค.
public class InstrumentedCompositionHashSet<E> implements Set<E> {
private final Set<E> set = new HashSet<>();
private int addCount = 0;
public int getAddCount() {
return addCount;
}
public boolean add(E e) {
addCount++;
return set.add(e);
}
public boolean addAll(java.util.Collection<? extends E> c) {
addCount += c.size();
return set.addAll(c);
}
@Override
public int size() {
return set.size();
}
@Override
public boolean isEmpty() {
return set.isEmpty();
}
@Override
public boolean contains(Object o) {
return set.contains(o);
}
...
}InstrumentedCompositionHashSet์ Set ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ Set์ด ์ฌ์ฉ๋๋ ๋ชจ๋ ๊ณณ์ ์ฌ์ฉ๋ ์ ์์ผ๋ฉฐ, ์ถ๊ฐ๋ ์์์ ๊ฐ์๋ฅผ ์ถ์ ํ๋ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด ๋ HashSet์ ์ฌ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ง์คํด์ ๋ณผ ํ์๊ฐ ์์ต๋๋ค.
๊ธฐ์กด์ ๋ฐฉ์์์๋ InstrumentedHashSet์ด ๊ณง HashSet์ด๋ฉด์ ๋ถ๊ฐ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํด๋์ค์์ต๋๋ค. ๋ฐ๋ผ์ add, addAll์ ์ค๋ฒ๋ผ์ด๋ฉํ๋ ๊ฒ์ ์ํผ ํด๋์ค์ ๊ตฌํ์ ์ํฅ์ ๋ฐ์ ์ฌ๋ฌ ๋ฌธ์ ๋ฅผ ๋ณ์์ต๋๋ค. ํ์ง๋ง InstrumentedCompositionHashSet์ HashSet์ด ์๋๋๋ค. ๋จ์ง ๋ด๋ถ ๊ตฌํ์ ์์ด์ HashSet์ ์ฌ์ฉํ ๋ฟ์
๋๋ค. InstrumentedCompositionHashSet์ Set์ด ์ ๊ณตํด์ผํ๋ ๋ชจ๋ ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ฉฐ, ๋๋ถ๋ถ์ ๋ฉ์๋์ ๊ฒฝ์ฐ ๊ทธ๋ฅ ๋ด๋ถ์ ์ผ๋ก ๊ฐ์ง๊ณ ์๋ HashSet์ ์์ฒญ์ ์์ํฉ๋๋ค. ๋จ ์
๋ ฅ ๊ธฐ๋ก์ ์ถ์ ํ๋ ๋ถ๋ถ์์๋ง ์์ฒด์ ์ผ๋ก ๊ฐ๊ณ ์๋ addCount๋ฅผ ๋๋ ค์ค ๋ค HashSet์ ์์ฒญ์ ๋ณด๋
๋๋ค.์ด๋ฌํ ํด๊ฒฐ์ฑ
์์๋ ์ด์ addAll์ด ๋ด๋ถ์ ์ผ๋ก add๋ฅผ ํธ์ถํ๋์ง ์ํ๋์ง์ ๋ํด์๋ ์ ํ ์๊ด์ด ์์ด์ก์ต๋๋ค. HashSet์ ๋์์ ์
๋ ฅ ๊ธฐ๋ก ์ถ์ ์ด๋์ ์ ํ ์๊ด ์๋ ๊ธฐ๋ฅ์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ์ค์ง InstrumentedCompositionHashSet์ add์ addAll์ด ํธ์ถ๋ ๋์๋ง addCount์ ์ํฅ์ ์ค๋๋ค. ๋ฐ๋ผ์ HashSet์ ๊ตฌํ์ด ๋ฐ๋์ด๋ InstrumentedCompositionHashSet์ ๊ธฐ์กด์ ๋ก์ง์ ์ ์งํ ์ ์์ต๋๋ค.
์์์ ์ธ๊ธํ ๋ ๋ค๋ฅธ ๋ฌธ์ ๋ HashSet ๋ฑ์์ ์์๋ฅผ ์ถ๊ฐํ๋ ๋ค๋ฅธ ๋ฉ์๋๊ฐ ์ถ๊ฐ๋์์ ๋ InstrumentedHashSet์ ์ด๋ฅผ ๋ฐ์ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ด ์ ํฉ์ฑ์ด ๊นจ์ง ์ ์์๋ค๋ ์ ์ ๋๋ค. ์ ํด๊ฒฐ๋ฒ์ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
๋ง์ฝ HashSet ํด๋์ค์ ์์๋ฅผ ์ฝ์ ํ๋ ๋ฉ์๋๊ฐ ์๋กญ๊ฒ ์์ฑ๋์๋ค๊ณ ํ์ ๋, InstrumentedCompositionHashSet์ ์ ํฉ์ฑ์ด ์ ์ง๊ฐ ๋ฉ๋๋ค. HashSet์ API์ InstrumentedCompositionHashSet์ API๋ ๋ณธ์ง์ ์ผ๋ก ๊ด๋ จ์ด ์์ ๋ฟ ๋๋ฌ, ํด๋์ค์ ํ๋๋ก ์กด์ฌํ๋ HashSet์ ์๋ก์ด ๋ฉ์๋๋ฅผ ์ธ๋ถ์์ ํธ์ถํ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ง์ฝ Set ์ธํฐํ์ด์ค ๋ ๋ฒจ์ ์์๋ฅผ ์ฝ์ ํ๋ ๋ฉ์๋๊ฐ ์๋กญ๊ฒ ์์ฑ๋์๋ค๊ณ ํ๋ค๋ฉด, InstrumentedCompositionHashSet์ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ ๊ฒ์ด๋ฏ๋ก ์๋ก์ด ๋ฉ์๋๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์์ด์ ๋์ฒ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
ForwardingSet
InstrumentedCompositionHashSet์ ํตํด ์์๊ณผ ์ค๋ฒ๋ผ์ด๋ฉ์์ ๋ฐ์ํ๋ ์ฌ๋ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์์ต๋๋ค. ํ์ง๋ง ์ด ์ฝ๋, ์ฌ์ ํ ์์ข์ ๋ณด์ด์ง ์๋์? ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ๋๋ค.
1. ๋จ์ํ ์ธ๋ถ์์ ๋ค์ด์จ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ด๋ถ์์ ๊ด๋ฆฌํ๋ HashSet์ ๋๊ฒจ์ฃผ๋ ๋ก์ง์ด ๋๋ฌด ๋ง๋ค.
์ด๋ ํด๋์ค์ ์์ง๋๋ฅผ ๋จ์ดํธ๋ฆฌ๋ ์์ธ ์ค ํ๋์ ๋๋ค. InstrumentedCompositionHashSet์ Set API์ ํด๋นํ๋ ๊ธฐ๋ฅ์ HashSet์ ์์ํด์ผํ๋ ์ญํ ๊ณผ ๋์์ ์์๊ฐ ์ถ๊ฐ๋๋ ํ์๋ฅผ ์ถ์ ํด์ผํ๋ ์ญํ ์ ์ํํ๊ณ ์์ต๋๋ค.
2. ์๋ฃ๊ตฌ์กฐ๊ฐ HashSet์ผ๋ก ๊ณ ์ ๋์ด์๋ค.
ํ์ฌ ์ํฉ์์๋ ๋ค์ด์จ ์์์ ๊ฐ์๋ฅผ ์ถ์ ํ๋ TreeSet์ ๋ง๋๋ ค๋ฉด InstrumentedCompositionTreeSet์ด๋ผ๋ ํด๋์ค๋ฅผ ์๋กญ๊ฒ ๋ง๋ค์ด์ผ ํ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ ForwardingSet์ด๋ผ๋ ํด๋์ค๋ฅผ ํตํด ์์์ ์ญํ ๊ณผ ๊ธฐ๋ก์ ์ญํ ์ ๋ถ๋ฆฌํด๋์ผ๋ก์จ ํด๊ฒฐํ ์ ์์ต๋๋ค.
public class ForwardingSet<E> implements Set<E> {
private final Set<E> set;
public ForwardingSet(Set<E> set) {
this.set = set;
}
@Override
public int size() {
return set.size();
}
@Override
public boolean isEmpty() {
return set.isEmpty();
}
@Override
public boolean contains(Object o) {
return set.contains(o);
}
...
}ForwardingSet์ ๊ธฐ์กด์ InstrumentedCompositionHashSet์์ ๋จ์ํ ๋ด๋ถ ํ๋์ ์์ฒญ์ ์์ํ๋ ์ญํ ๋ง์ ๋ถ๋ฆฌํด๋ธ ํด๋์ค์ ๋๋ค. ๋์ฌ๊ฒจ ๋ณผ ์ ์ ForwardingSet์ ์์ฑ์๋ก Set ์ ๋ฐ์ ์ด๋ฅผ ํ๋์ ์ ์ฅํ๊ณ ์๋ค๋ ์ ์ ๋๋ค. ์ด๋ ๊ธฐ์กด์ ๋ฐฉ์์์ HashSet์ ์ง์ ํ๋์์ ์์ฑํ๋ ๋ถ๋ถ๊ณผ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ForwardingSet์ ์์ฒญ์ ์์ํ ๊ฐ์ฒด๋ฅผ ์ธ๋ถ๋ก๋ถํฐ ๋ฐ๊ธฐ ๋๋ฌธ์ Set์ ๊ตฌํ์ฒด์ ๊ตญํ๋์ง ์์ ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
public class InstrumentedSet<E> extends ForwardingSet<E> {
private int addCount = 0;
public InstrumentedSet(Set<E> set) {
super(set);
}
@Override
public boolean add(E e) {
addCount++;
return super.add(e);
}
@Override
public boolean addAll(java.util.Collection<? extends E> c) {
addCount += c.size();
return super.addAll(c);
}
public int getAddCount() {
return addCount;
}
}InstrumentedSet์ ForwardingSet์ ์์ํ๋ ํด๋์ค์ ๋๋ค. ๊ธฐ์กด์ InstrumentedCompositionHashSet ์ด ์์ํ๋ ์ฝ๋๊น์ง ๋ชจ๋ ๊ฐ๊ณ ์์๋ ๊ฒ์ ๋ฐํ์ฌ InstrumentedSet์ ์ค์ง ๊ธฐ๋ก์ ์ถ์ ํ๋ ๋ถ๋ถ๊ณผ ๊ด๋ จ์๋ ์ฝ๋๋ง ์์ฑ๋์ด ์์ด ์์ง๋๊ฐ ๋์์ง๊ณ ์ ์ง๋ณด์๊ฐ ํธํด์ก์ต๋๋ค. ์ด๋ ๊ฒ ํจ์ผ๋ก์จ Composition์์ ์ค๋ ๋ชจ๋ ์ด์ ์ ์ฑ๊ธฐ๋ฉด์ ์ฝ๋ ์ ์ง๋ณด์์ฑ์ ๋์ด๊ณ ์๋ฃ๊ตฌ์กฐ์ ๊ตญํ๋์ง ์๋ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ด์ ๋ ๋น๋จ ๊ธฐ๋ก์ ์ถ์ ํ๋ ์ญํ ์ ํ๋ Set ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํด๋์ค๋ ForwardingSet์ ํตํด์ ์์ฝ๊ฒ ๋ง๋ค ์ ์์ ๊ฒ์ ๋๋ค.
์๋๋ InstrumentedSet์ด ์๋๋๋ก ๋์ํ๋์ง ํ ์คํธํ๋ ์ฝ๋์ ๋๋ค.
@Test
void testAddCount() {
InstrumentedSet<Integer> set = new InstrumentedSet<>(new TreeSet<>());
set.add(1);
set.add(2);
set.addAll(List.of(3, 4, 5));
Assertions.assertEquals(5, set.getAddCount());
}Liscov Subtitution Principle ๋ฆฌ์ค์ฝํ ์นํ ์์น
์ ์์๋ฅผ ํตํด ์์์ ํตํ ๊ธฐ๋ฅํ์ฅ์ ๋ํด์ ์ด๋ค ์ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ฌ์ง๊ฐ ์๋์ง, ์ด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ธ์ง์ ๋ํด ์ดํด๋ดค์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด, ์ ๋ง ์์์ ๋์๊ฑธ๊น์? ๊ทธ๋ ์ง๋ ์์๋ณด์ ๋๋ค. ๋น์ฅ ์์ ์์์๋ ForwardingSet์ ์์ํ InstrumentedSet์ ์ข์ ์์๋ก ๋ค์์ต๋๋ค.
๊ทธ๋ผ ์ธ์ ์ด๋ค ๊ฒฝ์ฐ์ ์์์ ์ฌ์ฉํด์ผํ ๊น์? LSP๋ ์ด์ ๋ํ ํ๋์ ์์น์ ์ ์ํฉ๋๋ค. LSP๋ ๊ฐ์ฒด์งํฅ ์ค๊ณ 5์์น ์ค ํ๋๋ก, ๋ชจ๋ ์๋ธํ์ ์ ์ํผํ์ ์ผ๋ก ๋์ฒด๋ ์ ์์ด์ผ ํ๋ค๋ ์์์ ๊ฐ์ด๋๋ผ์ธ์ ์ ๊ณตํฉ๋๋ค.
์ ์ฌ๊ฐํ-์ง์ฌ๊ฐํ ๋ฌธ์
ํํ ์ฌ๋ฌ ๊ธ์์ ์์์ ์๋ก ๋ค๋ฅธ ๋ ํ์ ์ด IS-A ๊ด๊ณ์ผ ๋ ์ด๋ฌํ ๊ด๊ณ๋ฅผ ์ถ์ํํ๊ณ ์ ์ฌ์ฉํ๋ค๊ณ ํฉ๋๋ค. A์ B๊ฐ IS-A ๊ด๊ณ๋ผ๋ ๊ฒ์ ๊ณง โA๋ B์ด๋คโ ํน์ A๋ B์ ํฌํจ๋๋คโ ๋ผ๋ ๊ด๊ณ๋ฅผ ์๋ฏธํ๋๋ฐ, ์ด ์๋ฏธ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ์ง ๋ชปํ์ ๋์๋ ์ข์ ๊ฐ์ฒด์งํฅ ์ค๊ณ๋ฅผ ํ์ง ๋ชปํ๊ฒ ๋ ์๋ ์์ต๋๋ค. ์ด ์๋ฏธ๋ฅผ ํผ๋ํ์ ๋ ๋ฐ์ํ๋ ์์ ์ค ํ๋๋ ์ ์ฌ๊ฐํ-์ง์ฌ๊ฐํ ๋ฌธ์ ์ ๋๋ค.
์ ํ์ ์์์์ ๋๋ฌผ์ ๋ ์ผ๋ฐํ๋ ํ์ ์ด๊ณ ์ฒ์ถ๋๋ฌผ์ ๋ ํน์ํ๋ ํ์ ์ด์์ต๋๋ค. ์ด๋ฅผ ํด๋์ค ์์ ๊ตฌ์กฐ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ๋๋ค. ์๋์ ์ํฉ์์ Vertebrate๋ Animal์ ๋ชจ๋ ํน์ฑ๊ณผ ๊ธฐ๋ฅ์ ์์๋ฐ์ต๋๋ค.
class Animal {
...
}
//์ฒ์ถ๋๋ฌผ : Vertebrate
class Vertebrate extends Animal {
...
}์ด๋ ํฉ๋นํ ์์๊ตฌ์กฐ๋ก ๋ณด์ ๋๋ค. ๋ชจ๋ ์ฒ์ถ๋๋ฌผ์ ๋๋ฌผ์ด๊ณ , ๊ทธ๋ ๋ค๊ณ ํด์ ๋ชจ๋ ๋๋ฌผ์ด ์ฒ์ถ๋๋ฌผ์ ์๋๋๋ค. ๋๋ฌผ์ด ํ ์ ์๋ ๋ชจ๋ ํ์ โ ์ ์ ์๋ค๊ฑฐ๋, ๋ฐฅ์ ๋จน๋๋ค๊ฑฐ๋ ํ๋ ํ๋ โ ๋ Vertebrate์๊ฒ๋ ๋์ผํ๊ฒ ๊ธฐ๋ํ ์ ์๋ ํ๋์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ถ๊ฐ์ ์ผ๋ก Vertebrate๋ ์ฒ์ถ๋๋ฌผ๋ง์ ํน์ง์ด ์๋ ๋ฌด์ธ๊ฐ์ ํ๋์ ์ถ๊ฐ๋ก ์ํํ๊ฒ ๋ง๋ค ์ ์์ ๊ฒ์ ๋๋ค.
์ ๊ทธ๋ผ ์ ์ฌ๊ฐํ๊ณผ ์ง์ฌ๊ฐํ์ ๋ฌธ์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ง์ฌ๊ฐํ์ด๋ ๋ชจ๋ ๊ฐ์ด ์ง๊ฐ์ด๋ฉฐ ๋ง์ฃผ๋ณด๋ ๋ณ์ ๊ธธ์ด๊ฐ ๋์ผํ ์ฌ๊ฐํ์ ๋ปํฉ๋๋ค. ์ ์ฌ๊ฐํ์ด๋ ๋ชจ๋ ๊ฐ์ด ์ง๊ฐ์ด๋ฉฐ ๋ชจ๋ ๋ณ์ ๊ธธ์ด๊ฐ ๋์ผํ ์ฌ๊ฐํ์ ๋ปํฉ๋๋ค. ์ด๋ฌํ ์ ์ํ์ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ฅ์ ์ณ์ต๋๋ค.
๋ชจ๋ ์ ์ฌ๊ฐํ์ ์ง์ฌ๊ฐํ์ด๊ณ , ๊ทธ๋ ๋ค๊ณ ํด์ ๋ชจ๋ ์ง์ฌ๊ฐํ์ด ์ ์ฌ๊ฐํ์ ์๋๋ค.
์ ์ฌ๊ฐํ์ ์ง์ฌ๊ฐํ์ ํฌํจ๋๋ค.
์ ์ฌ๊ฐํ๊ณผ ์ง์ฌ๊ฐํ์ ๊ด๊ณ์์๋ ์ด๋ฐ ์ํผํ์ - ์๋ธํ์ ๊ด๊ณ๊ฐ ์กด์ฌํ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ์ง์ฌ๊ฐํ์ ์ข ๋ ์ผ๋ฐ์ ์ธ ๊ฐ๋ ์ด๊ณ , ์ ์ฌ๊ฐํ์ ์ง์ฌ๊ฐํ ์ค ๋ชจ๋ ๋ณ์ด ๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ์ง์นญํ๋ ํน์ํ ๊ฐ๋ ์ผ๋ก ๋ณด์ ๋๋ค. ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ์์ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ์ ์์ ๊ฒ ๊ฐ์ ๋ณด์ ๋๋ค.
// ์ํผํ์
์ง์ฌ๊ฐํ
class Rectangle {
}
// ์๋ธํ์
์ ์ฌ๊ฐํ
class Sqaure extends Rectangle {
}๋ฌธ์ ์
์ด ์์๊ตฌ์กฐ๋ ๋ช๊ฐ์ง ๋ฌธ์ ์ ์ ๋ณ์ต๋๋ค. ์ฃผ์ํ ํฌ์ธํธ ์ค ํ๋๋ Rectangle์์ ์ ์๋ ๋ฉ์๋๊ฐ Sqaure ๋ ๋ฒจ๋ก ๋ด๋ ค์์ ๋ ๊ทธ ์๋ฏธ๊ฐ ๋ชจํธํด์ง๋ค๋ ์ ์ ๋๋ค.
class Rectangle {
void setWidth(int w);
void setHeight(int h);
}Rectangle ํด๋์ค์ width์ height๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ์๊ตฌ์ฌํญ์ด ์๋ค๊ณ ํฉ์๋ค. ์ ์ฝ๋๋ ์ํผํด๋์ค์ธ Rectangle์ ๊ฐ์ฒด์ ๊ธธ์ด๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฉ์๋์ ๋๋ค. ํ ํธ, Sqaure ํด๋์ค๋ Rectangle์ ์์ํ์ผ๋ฏ๋ก ๋ชจ๋ ๊ธฐ๋ฅ์ ๊ฐ์ ธ์ค๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ ๋ฉ์๋ ํธ์ถ์ด ๊ฐ๋ฅํด์ง๋๋ค.
Sqaure sqaure = new Sqaure();
square.setWidth(4); //??
square.setHeight(10); //??Sqaure๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๋ ์ด๋ฅผ ์ด๋ป๊ฒ ๋ฐ์๋ค์ฌ์ผ ํ ๊น์? ๋ถ๋ช ์ ์ฌ๊ฐํ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๊ฒ์ผ๋ก ๊ธฐ๋ํ๋๋ฐ width์ height๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฉ์๋๊ฐ ์๊ฒจ๋ฒ๋ ธ์ต๋๋ค. width๋ height๋ n์ผ๋ก ๋ณ๊ฒฝ๋๋ฉด ๋ชจ๋ ๋ณ์ ๊ธธ์ด๊ฐ n์ด ๋ ๊ฒ์ด๋ผ๊ณ ์ ์ถ๋ฅผ ํด์ผํ ๊น์? ์๋๋ฉด ์ด๋ฐ ๋์์ ํ ์ ์์ผ๋ exception์ด ํฐ์ง ๊ฒ์ด๋ผ ์์ํด์ผํ ๊น์? ์ด๋ ์ฌ์ฉํ๋ ์ธก ๋ฟ๋ง ์๋๋ผ Sqaure๋ฅผ ๊ฐ๋ฐํ๋ ์ธก์์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ์ ํด์ผํ ์ง, ํ๋ค๋ฉด ์ด๋ป๊ฒ ๊ตฌํํด์ผํ ์ง, ๋๋ต๋๊ฐํ ๊ฒ์ ๋๋ค. ์ผ๋จ ์ ์ฌ๊ฐํ์ ๋ํด์๋ width๊ฐ N์ผ๋ก ์ค์ ๋๋ฉด height๋ N์ผ๋ก ์ค์ ๋๊ฒ ๊ตฌํํ๋ค๊ณ ์นฉ์๋ค.
void setWidthDouble(Rectangle rectangle) {
setWidth(getWidth() * 2));
}์ ๋ฉ์๋๋ Rectangle์ width๋ฅผ 2๋ฐฐ๋ก ๋ง๋๋ ๋ฉ์๋์ ๋๋ค. ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ์ธก์์๋ ๋น์ฐํ ํ๋ผ๋ฏธํฐ๋ก ๋ค์ด๊ฐ ๊ฐ์ฒด์ ๋ฉด์ ์ด 2๋ฐฐ๊ฐ ๋์ ๊ฒ์ด๋ผ ์์ํ ์ ์์ต๋๋ค. ๋ํ height๋ ๋ฐ๋์ง ์์์ ๊ฒ์ด๋ผ ์์ํ ๊ฒ์ ๋๋ค. ํ์ง๋ง ์ด๋ฌํ ์์์ ํ๋ผ๋ฏธํฐ์ Square ๊ฐ์ฒด๊ฐ ๋ค์ด์ด๊ณผ ๋์์ ์ด๊ธ๋๊ฒ ๋ฉ๋๋ค. ์ด๋ฌํ ์ํฉ์ ํ๋ก๊ทธ๋จ์ด ์์์น ๋ชปํ๊ฒ ๋์๊ฐ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
ํ๋์ ๊ธฐ์ค์ผ๋ก ๋ถ๋ฅํ์ ๋ ์นํํ ์ ์๋ค
์์ ๊ฐ์ ๋ฌธ์ ๋ ์ ๋ฐ์ํ์๊น์? ๋ถ๋ช ์ ์ฌ๊ฐํ๊ณผ ์ง์ฌ๊ฐํ์๋ IS-A ๊ด๊ณ๊ฐ ์์๋๋ฐ ๋ง์ด์ฃ . ์ฌ์ค ์ด๋ IS-A ๊ด๊ณ๋ฅผ ์๋ชป ํด์ํ์ฌ ๋ฐ์ํ ๋ฌธ์ ์ ๋๋ค.
IS-A ๊ด๊ณ๋ฅผ ๋ฐ์ ธ ์ํผํ์ ๊ณผ ์๋ธํ์ ์ ๋ถ๋ฅํ ๋๋ ์ด๋ ํ ๊ฐ์ฒด์ ์ ์๊ฐ ์๋ ํ๋์ ๊ธฐ์ค์ผ๋ก ๋ถ๋ฅํด์ผํฉ๋๋ค. ์๋ธํ์ ์ ์ํผํ์ ์ ํ๋์ ๋ชจ๋ ์ํํ ์ ์์ผ๋ฉด์ ๋ ํน์ํ ํ๋์ ํ ์ ์์ ๋ ์ฑ๋ฆฝํฉ๋๋ค. ๋ฐ๋๋ก ์ํผํ์ ์ ๋ชจ๋ ์๋ธํ์ ์ ์ผ๋ฐํ๋ ํ๋์ ์ํํ ์ ์์ ๋ ์ฑ๋ฆฝํฉ๋๋ค. ์ด๋ฌํ ๊ธฐ์ค์ผ๋ก ์ ์ฌ๊ฐํ-์ง์ฌ๊ฐํ ๋ฌธ์ ๋ฅผ ๋ดค์ ๋, ๋ ๊ด๊ณ๋ ํ ์ํฉ์์ IS-A ๊ด๊ณ๊ฐ ์๋์ ์ ์ ์์ต๋๋ค. ์ํผ ํ์ ์์ ํ ์ ์๋ ํ๋์ธ width์ height๋ฅผ ๋ ์์ ์ผ๋ก ๋ฐ๊พธ๋ ํ์๋ ์ ์ฌ๊ฐํ์์ ๊ธฐ๋ํ ์ ์๋ ํ๋์ด ์๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
ํ๋์ ๊ธฐ์ค์ผ๋ก ๋ถ๋ฅํ์ ๋, ์๋ธํ์ ์ ์ํผํ์ ์ ์นํํ ์ ์๊ฒ ๋ฉ๋๋ค. ์ํผํ์ ์ด ์ฌ์ฉ๋๋ ๊ณณ์ ์๋ธํ์ ์ด ๋์ฒดํด๋ ์ด์ํจ์ด ์์ผ๋ฉฐ ๊ธฐ๋๋๋ ํ๋์ ์๋ธํ์ ์ ๋ก์ง์ ํตํด ์ํํ ์ ์๋ค๋ ์๋ฏธ์ ๋๋ค. ๋ฆฌ์ค์ฝํ ์นํ ์์น์ ์ด๋ฌํ ๋ถ๋ฅ ํ์ ๋ชจ๋ ์๋ธํ์ ์ด ์ํผํ์ ์ ์นํํ ์ ์๊ฒ ๋ง๋๋ ๊ฒ์ด ์ข์ ์์๊ตฌ์กฐ๋ผ๋ ๋ด์ฉ์ ์ ์ํฉ๋๋ค.
๋ฌผ๋ก IS-A ๊ด๊ณ๋ ํ๋์ผ๋ก ๋ถ๋ฅ๋๊ธฐ ๋๋ฌธ์, ํ์ฌ ๋ฌธ์ ๊ฐ ๋๋ ํ๋์ธ ๋ณ์ ๊ธธ์ด๋ฅผ ๋ณ๊ฒฝํ๋ ๋ก์ง์ด ์๋ค๋ฉด ๊ธฐ์กด์ ์์๊ด๊ณ๊ฐ ๊ด์ฐฎ์์ง๋ ๋ชจ๋ฆ ๋๋ค.
public class Rectangle implements Shape {
private final int width;
private final int height;
public Rectangle(int w, int h) {
this.width = w;
this.height = h;
}
@Override
public int getArea() {
return width * height;
}
}
public class Sqaure extends Rectangle {
public Square(int s) {
super(s, s);
}
}private int sumAllRectangleArea(List<Rectangle> rectangles) {
return rectangles.stream().mapToInt(Rectangle::getArea).sum();
}
@Test
void test() {
List<Rectangle> rectangles = List.of(new Rectangle(2, 4), new Square(3));
System.out.println(sumAllRectangleArea(rectangles)); // 17
}์ ๋ฆฌ
์ ๊ธ์ ํตํด ์์์์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์ ๊ณผ ์์์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๊ธฐ ์ํ ์์น์ ๋ํด ์์๋ณด์์ต๋๋ค.
์์์ ํ์ ์ ๊ณ์ธต๊ด๊ณ๋ฅผ ํด๋์ค ์์ค์์ ํํํ ์ ์๋ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค. ๋ค๋ง, ์์์์ ๋ฐ์ํ๋ ์ํผํด๋์ค์ ์๋ธํด๋์ค์ ๊ฐํ ๊ฒฐํฉ์ ์ข ์ข ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ฌ์ง ์ญ์ ์กด์ฌํฉ๋๋ค. ๊ณผ์ฐ ์ฐ๋ฆฌ๊ฐ ๊ฐ๋ฐํ๋ ๋จ๊ณ์์ ๊ณ ๋ฏผํด์ ๋ด๋์ ๊ฒฐ๊ณผ์ธ IS-A ๊ด๊ณ์ ์์๊ตฌ์กฐ๋ ์ํํธ์จ์ด๊ฐ ์งํ๋๋ ๊ณผ์ ๊ฐ์ ์ญ ์ ์ง๋ ๊น์? ์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ์ผ์ ์ถํ์ ์๊ธธ ์๋ง์ ์๊ตฌ์ฌํญ์ ์์ธกํ๊ณ ๋ถ์ํ์ฌ ์ ์ ํ ์์ ๊ด๊ณ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ๋ฐ์ ์์ต๋๋ค. ์ธ๊ฐ์ ์์ธก๋ ฅ์ด 100%๊ฐ ์๋ ๋งํผ ๋์ค์ ์์์น ๋ชปํ ์๊ตฌ์ฌํญ์ด ์๊ธด๋ค๋ฉด ๊ธฐ์กด์ ์ฝ๋ ์ค ๋๋ฌด ๋ง์ ๋ถ๋ถ์ ์์ ํด์ผํ ์ง๋ ๋ชจ๋ฆ ๋๋ค.
๋ฐ๋ผ์ ์์์ ํ์ ๊ฐ์ ๊ณ์ธต๊ด๊ณ๊ฐ ์์์ด ๋ถ๋ช ํ ๋ ์ฌ์ฉํ๋, ๋จ์ ์ฝ๋ ์ฌ์ฌ์ฉ ๋ชฉ์ ์ผ๋ก๋ Composition์ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํ๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.