μμμ μ½λλ₯Ό μ¬μ¬μ©νλ κ°λ ₯ν μλ¨μ΄μ§λ§, νμ μ΅μ μ μλλ€. μλͺ» μ¬μ©νλ©΄ μ€λ₯λ₯Ό λ΄κΈ° μ¬μ΄ μννΈμ¨μ΄λ₯Ό λ§λ€κ² λλ€. μμ ν΄λμ€μ νμ ν΄λμ€λ₯Ό λͺ¨λ κ°μ νλ‘κ·Έλλ¨Έκ° ν΅μ νλ ν¨ν€μ§ μμμλΌλ©΄ μμλ μμ ν λ°©λ²μ΄λ€.
νμ₯ν λͺ©μ μΌλ‘ μ€κ³λμκ³ λ¬Έμνλ μ λ ν΄λμ€λ λ§μ°¬κ°μ§ μμ νλ€. νμ§λ§ μΌλ°μ μΈ κ΅¬μ²΄ ν΄λμ€λ₯Ό ν¨ν€μ§ κ²½κ³λ₯Ό λμ΄, μ¦ λ€λ₯Έ ν¨ν€μ§μ ꡬ체 ν΄λμ€λ₯Ό μμνλ μΌμ μννλ€.
μ¬κΈ°μ λ€λ£° 'μμ'μ ν΄λμ€κ° λ€λ₯Έ ν΄λμ€λ₯Ό νμ₯νλ 'ꡬν μμ'μ λ§νλ€. ν΄λμ€κ° μΈν°νμ΄μ€λ₯Ό ꡬννκ±°λ μΈν°νμ΄μ€κ° λ€λ₯Έ μΈν°νμ΄μ€λ₯Ό νμ₯νλ 'μΈν°νμ΄μ€ μμ'κ³Όλ 무κ΄ν κ²μ΄λ€.
λ©μλ νΈμΆκ³Ό λ¬λ¦¬ μμμ μΊ‘μνλ₯Ό κΉ¨λ¨λ¦°λ€. λ¬Έμ κ° λ°μνλ 2κ°μ§ μ΄μ μ λν΄μ μμλ³΄κ³ ν΄κ²°μ± μ λν΄μ μμ보μ.
λ¬Έμ 1. μμ ν΄λμ€κ° μ΄λ»κ² ꡬνλλλμ λ°λΌ νμ ν΄λμ€μ λμμ μ΄μμ΄ μκΈΈ μ μλ€. π«
public class InstrumentedHashSet<E> extends HashSet<E> {
// μΆκ°λ μμμ μ
private int addCount = 0;
public InstrumentedHashSet() {
}
public InstrumentedHashSet(int initCap, float loadFactor) {
super(initCap, loadFactor);
}
@Override
public boolean add(E e){
addCount++;
return super.add(e);
}
@Override
public boolean addAll(Collection<? extends E> c){
addCount += c.size();
return super.addAll(c);
}
public int getAddCount() {
return addCount;
}
}
μ±λ₯μ λμ΄λ €λ©΄ HashSetμ μ²μ μμ±λ μ΄ν μμκ° λͺ κ° λν΄μ‘λμ§ μ μ μμ΄μΌ νλ€. κ·Έλ¬ν μ μ κ³ λ €νμ¬ HashSetμ μμν InstrumentedHashSetμμ addCount λ³μλ₯Ό μΆκ°νκ³ , addμ addAll λ©μλλ₯Ό μ€λ²λΌμ΄λ©νμλ€. κ·Έλ¦¬κ³ μλμ κ°μ μμ μ νμλ€κ³ μκ°ν΄ 보μ.
public static void main(String[] args) {
InstrumentedHashSet<String> s = new InstrumentedHashSet<>();
s.addAll(List.of("ν±", "νν", "ν"));
System.out.println(s.getAddCount());
}
3μ μΆλ ₯ν κ±°λΌκ³ κΈ°λνκ² μ§λ§, μ€μ λ‘λ 6μ μΆλ ₯νλ€. κ·Έ μ΄μ λ HashSetμ addAll λ©μλκ° addλ©μλλ₯Ό μ¬μ©ν΄ ꡬνλ λ° μλ€.
// μμ ν΄λμ€(AbstractCollection)μμμ addAll λ©μλ
public boolean addAll(Collection<? extends E> c) {
boolean modified = false;
for (E e : c)
if (add(e))
modified = true;
return modified;
}
μ°λ¦¬κ° λ§λ InstrumentedHashSetμμ HashSetμ addAllμ νΈμΆνκΈ° μ μ addCountμ 3μ λν¨μΌλ‘μ¨ μ΄λ―Έ μ λ°μ΄νΈν΄ μ£Όμλ€. νμ§λ§ HashSetμμ addAllμ κ° μμλ₯Ό add λ©μλλ₯Ό νΈμΆν΄ μΆκ°νκ³ μλ€. κ·Έ κ²°κ³Ό μ€λ²λΌμ΄λ©ν addκ° λΆλ¦¬λ©΄μ λ€μ νλ² addCountμ 3μ λν΄μ€ κ²μ΄λ€. κ·Έλμ 6μ΄ λμλ€.
λ¬Όλ‘ νμ ν΄λμ€μμ addAll λ©μλλ₯Ό μ¬μ μνμ§ μμΌλ©΄ λ¬Έμ λ₯Ό κ³ μΉ μ μλ€. νμ§λ§ λΉμ₯μ μ λλ‘ λμν μ§ λͺ¨λ₯΄λ, HashSetμ addAllμ΄ add λ©μλλ₯Ό μ΄μ©ν΄ ꡬννμμ κ°μ ν ν΄λ²μ΄λΌλ νκ³λ₯Ό μ§λλ€.
κ·Έλ¦¬κ³ allAll λ©μλλ₯Ό λ€λ₯Έ μμΌλ‘ μ¬μ μν΄μλ λ¬Έμ λ₯Ό κ³ μΉ μ μλ€. μλ₯Ό λ€μ΄ μ£Όμ΄μ§ 컬λ μ μ μννλ©° μμ νλλΉ add λ©μλλ₯Ό ν λ²λ§ νΈμΆνκ² νλ κ²μ΄λ€. νμ§λ§ μμ ν΄λμ€μ λ©μλ λμμ λ€μ ꡬννλ λ°©μμ μ΄λ ΅κ³ , μκ°λ λ€κ³ , μμΉ« μ€λ₯λ₯Ό λ΄κ±°λ μ±λ₯μ λ¨μ΄λ¨λ¦΄ μ μλ€λ λ¬Έμ κ° μλ€. λν νμ ν΄λμ€μμλ μ κ·Όν μ μλ private νλλ₯Ό μ¨μΌ νλ μν©μ΄λΌλ©΄ μ΄ λ°©μμΌλ‘λ ꡬν μμ²΄κ° λΆκ°λ₯νλ€λ λ¬Έμ κ° μλ€.
λ¬Έμ 2. μμ ν΄λμ€μ μλ‘μ΄ λ©μλκ° μΆκ°λλ€λ©΄ νμ ν΄λμ€κ° κΉ¨μ§ μ μλ€. π¬
μμ ν΄λμ€μ ꡬν λ°©μμ λ³νλΏλ§ μλλΌ μμ ν΄λμ€μμ μλ‘μ΄ λ©μλκ° μκΈ°λ κ²½μ°μλ νμ ν΄λμ€κ° μ½κ² κΉ¨μ§ μ μλ€.
μλ₯Ό λ€μ΄ μμ ν΄λμ€μμ 보μμ μ΄μ λ‘ μ»¬λ μ μ μΆκ°λ λͺ¨λ μμκ° νΉμ 쑰건μ λ§μ‘±ν΄μΌ νλ κ²½μ°κ° μλ€κ³ νμ. κ·Έλ¬λ©΄ κ·Έ 컬λ μ μ μμνμ¬ νΉμ μμλ₯Ό μΆκ°νλ λͺ¨λ λ©μλλ₯Ό μ¬μ μν΄ νμν 쑰건μ λ¨Όμ κ²μ¬νκ²λ νλ©΄ λλ€.
νμ§λ§ νμ ν΄λμ€μμ μμ κ²½μ°λ₯Ό κ³ λ €νμ§ μκ³ κΈ°μ‘΄ λ°©μλλ‘ μμλ₯Ό μΆκ°νκ² λλ€λ©΄ 'νμ©λμ§ μμ' μμλ₯Ό μΆκ°νλ μν©μ΄ λ°μν μ μλ€. κ·Έλ¦¬κ³ μμν΄λμ€μμ λ©μλκ° μΆκ°λμλ€λ μ¬μ€μ νμν΄λμ€μμ μΈμ§νκΈ°κ° μ½μ§ μλ€,
ν΄κ²°μ± . μ»΄ν¬μ§μ (Composition)μ μ¬μ©νλΌ πΊ
μμ μ΄ν΄λ³Έ μμμ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν λ°©λ²μΌλ‘ μ»΄ν¬μ§μ (Composition)μ΄λΌλ κ²μ΄ μλ€. κΈ°μ‘΄ ν΄λμ€λ₯Ό νμ₯νλ λμ , μλ‘μ΄ ν΄λμ€λ₯Ό λ§λ€κ³ private νλλ‘ κΈ°μ‘΄ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μ°Έμ‘°νκ² νλ κ²μ΄λ€.
// μ¬μ¬μ©ν μ μλ μ λ¬ ν΄λμ€
public class ForwardingSet<E> implements Set<E> {
private final Set<E> s;
public ForwardingSet(Set<E> s){
this.s = s;
}
public void clear() { s.clear(); }
public boolean contains(Object o) { return s.contains(o); }
public boolean isEmpty() { return s.isEmpty(); }
public int size() { return s.size(); }
public Iterator<E> iterator() { return s.iterator(); }
public boolean add(E e) { return s.add(e); }
public boolean remove(Object o) { return s.remove(o); }
public boolean containsAll(Collection<?> c)
{ return s.containsAll(c); }
public boolean addAll(Collection<? extends E> c)
{ return s.addAll(c); }
public boolean removeAll(Collection<?> c)
{ return s.removeAll(c); }
public boolean retainAll(Collection<?> c)
{ return s.retainAll(c); }
public Object[] toArray() { return s.toArray(); }
public <T> T[] toArray(T[] a) { return s.toArray(a); }
@Override
public boolean equals(Object o) { return s.equals(o); }
@Override
public int hashCode() { return s.hashCode(); }
@Override
public String toString() { return s.toString(); }
}
// λνΌ ν΄λμ€ - μμ λμ μ»΄ν¬μ§μ
μ μ¬μ©
public class InstrumentedSet<E> extends ForwardingSet<E> {
private int addCount = 0;
public InstrumentedSet(Set<E> s) {
super(s);
}
@Override
public boolean add(E e){
addCount++;
return super.add(e);
}
@Override
public boolean addAll(Collection<? extends E> c) {
addCount += c.size();
return super.addAll(c);
}
public int getAddCount() {
return addCount;
}
}
μ©μ΄λ₯Ό μ΄ν΄λ³΄μ.
- μ»΄ν¬μ§μ
(Composition)
κΈ°μ‘΄ ν΄λμ€κ° μλ‘μ΄ ν΄λμ€μ ꡬμ±μμλ‘ μ°μΈλ€λ λ» - μ λ¬(Forwarding)
μ ν΄λμ€μ μΈμ€ν΄μ€ λ©μλλ€μ κΈ°μ‘΄ ν΄λμ€μ λμνλ λ©μλλ₯Ό νΈμΆν΄ κ·Έ κ²°κ³Όλ₯Ό λ°ννλ κ² - μ λ¬ λ©μλ(Forwarding Method)
μ ν΄λμ€μ λ©μλλ€μ μ λ¬νλ κ² - λνΌ ν΄λμ€(Wrapper Class)
InstrumentedSetκ³Ό κ°μ΄ λ€λ₯Έ Set μΈμ€ν΄μ€λ₯Ό κ°μΈκ³ (wrap) μλ κ²
μ»΄ν¬μ§μ μ μ¬μ©νλ©΄ 맨 μ²μ μμμΈ InstrumentedHashSetκ³Ό λ¬λ¦¬ μμ ν΄λμ€μ μν₯μ λ°μ§ μκ² λλ€.
public static void main(String[] args) {
InstrumentedSet<String> s = new InstrumentedSet<>(new HashSet<>());
s.addAll(List.of("ν±", "νν", "ν"));
System.out.println(s.getAddCount());
}
μ¦, μ¬μ΄λ μ΄ννΈκ° μκ² λλ€. InstrumentedHashSetκ³Ό λ¬λ¦¬ InstrumentedSetμ μ¬μ©νλ©΄ 6μ΄ μλ μ°λ¦¬κ° μλνλ λλ‘ 3μ΄ λμ€κ² λλ€.
μ»΄ν¬μ§μ μ μ¬μ©νλ©΄ μλ‘μ΄ ν΄λμ€λ κΈ°μ‘΄ ν΄λμ€μ λ΄λΆ ꡬν λ°©μμ μν₯μμ λ²μ΄λλ©°(λ¬Έμ 1 ν΄κ²°), μ¬μ§μ΄ κΈ°μ‘΄ ν΄λμ€μ μλ‘μ΄ λ©μλκ° μΆκ°λλλΌλ μ ν μν₯μ λ°μ§ μλλ€(λ¬Έμ 2 ν΄κ²°). κ·Έλ¬λ―λ‘ μΊ‘μνκ° μλ²½ν μ§μΌμ§κ² λλ€. (Setμ΄ μλ HashSetμλ§ λ©μλκ° μΆκ°λλ€λ©΄ Forwarding μ½λλ λ°λμ§ μλλ€. λ§μ½ μΈν°νμ΄μ€μ μλ‘μ΄ λ©μλκ° μΆκ°λλ€λ©΄ λ³νλ₯Ό μμ차릴 μλ°μ μλ€.)
λν, μ»΄ν¬μ§μ μ μ΄μ©ν΄μ ν λ²λ§ ꡬνν΄ λλ©΄ μ΄λ ν Set ꡬν체λΌλ κ³μΈ‘ν μ μμΌλ©°, κΈ°μ‘΄ μμ±μλ€κ³Όλ ν¨κ» μ¬μ©ν μ μκ² λλ€.
ν΄λΉ κΈμ λ°±κΈ°μ λμ 'μ΄νν°λΈ μλ° μλ²½ 곡λ΅'μ μ°Έκ³ νμμ΅λλ€.