μλ°κ° μ 곡νλ λ€μ€ ꡬν λ©μ»€λμ¦μ 'μΈν°νμ΄μ€μ μΆμ ν΄λμ€' 2κ°μ§κ° μλ€. μλ° 8λΆν° μΈν°νμ΄μ€λ Default Methodλ₯Ό μ 곡ν μ μκΈ° λλ¬Έμ λ λ©μ»€λμ¦ λͺ¨λ μΈμ€ν΄μ€ λ©μλλ₯Ό ꡬν ννλ‘ μ 곡ν μ μλ€.
λμ κ°μ₯ ν° μ°¨μ΄λ μΆμ ν΄λμ€κ° μ μν νμ
μ ꡬννλ ν΄λμ€λ λ°λμ μΆμ ν΄λμ€μ νμ ν΄λμ€κ° λμ΄μΌ νλ€λ μ μ΄λ€. μλ°λ λ¨μΌ μμλ§ μ§μνλ, μΆμ ν΄λμ€ λ°©μμ μλ‘μ΄ νμ
μ μ μνλ λ° μ»€λ€λ μ μ½μ μκ² λλ κ²μ΄λ€.
λ°λ©΄ μΈν°νμ΄μ€κ° μ μΈν λ©μλλ₯Ό λͺ¨λ μ μνκ³ κ·Έ μΌλ° κ·μ½μ μ μ§ν¨ ν΄λμ€λΌλ©΄ λ€λ₯Έ μ΄λ€ ν΄λμ€λ₯Ό μμνλ κ°μ νμ
μΌλ‘ μ·¨κΈλλ€.
μ¬κΈ°κΉμ§κ° μΆμν΄λμ€μ μΈν°νμ΄μ€μ λν κ°λ¨ν μ€λͺ μ΄λ€. μ΄λ² κΈμμ μΈν°νμ΄μ€μ 5κ°μ§ μ₯μ λ€μ μ΄ν΄λ³΄λ©΄μ 'μ μΆμ ν΄λμ€λ³΄λ€ μΈν°νμ΄μ€λ₯Ό μ°μ ν΄μ μ¬μ©ν΄μΌ νλκ°'μ λν μ΄μ λ₯Ό μμ보μ.
μ₯μ 1. κΈ°μ‘΄ ν΄λμ€μλ μμ½κ² μλ‘μ΄ μΈν°νμ΄μ€λ₯Ό ꡬνν΄ λ£μ μ μλ€. π΅
μΈν°νμ΄μ€λ₯Ό ꡬννλ λ°©λ²μ λ§€μ° μ½λ€. μΈν°νμ΄μ€κ° μꡬνλ λ©μλλ₯Ό μΆκ°νκ³ , ν΄λμ€ μ μΈμ implements κ΅¬λ¬Έλ§ μΆκ°νλ©΄ λλ€. (μλ° νλ«νΌμμλ Comparable, Iterable, AutoCloseable μΈν°νμ΄μ€κ° μλ‘ μΆκ°λμμ λ νμ€ λΌμ΄λΈλ¬λ¦¬μ μλ§μ κΈ°μ‘΄ ν΄λμ€κ° μ΄ μΈν°νμ΄μ€λ€μ ꡬνν μ± λ¦΄λ¦¬μ€ λμλ€.)
νμ§λ§, κΈ°μ‘΄ ν΄λμ€ μμ μλ‘μ΄ μΆμ ν΄λμ€λ₯Ό λΌμλ£κΈ°λ μ΄λ ΅λ€. λ ν΄λμ€κ° κ°μ μΆμ ν΄λμ€λ₯Ό νμ₯νκΈΈ μνλ€λ©΄, κ·Έ μΆμ ν΄λμ€λ κ³μΈ΅κ΅¬μ‘°μ λ ν΄λμ€μ κ³΅ν΅ μ‘°μμ΄μ΄μΌ νκΈ° λλ¬Έμ΄λ€. μ΄ λ°©μμ ν΄λμ€ κ³μΈ΅κ΅¬μ‘°μ 컀λ€λ νΌλμ μΌκΈ°νλ€.
μ₯μ 2. μΈν°νμ΄μ€λ λ―Ήμ€μΈ(mixin) μ μμ μμ±λ§μΆ€μ΄λ€. πΆ
'λ―Ήμ€μΈ(mixin)'μ΄λ ν΄λμ€κ° ꡬνν μ μλ νμ μΌλ‘, λ―Ήμ€μΈμ ꡬνν ν΄λμ€μ μλμ 'μ£Όλ νμ 'μΈμλ νΉμ μ νμ νμλ₯Ό μ 곡νλ€κ³ μ μΈνλ ν¨κ³Όλ₯Ό μ€λ€. μλ₯Ό λ€μ΄, Comparableμ μμ μ ꡬνν ν΄λμ€μ μΈμ€ν΄μ€λ€λΌλ¦¬λ μμλ₯Ό μ ν μ μλ€κ³ μ μΈνλ λ―Ήμ€μΈ μΈν°νμ΄μ€μ΄λ€.
μΈν°νμ΄μ€λ λ―Ήμ€μΈμ μ μν μ μμ§λ§, μΆμ ν΄λμ€λ‘λ λ―Ήμ€μΈμ μ μν μ μλ€. μ΄μ λ κ°λ¨νλ€. κΈ°μ‘΄ ν΄λμ€μ λ§μμΈ μ μκΈ° λλ¬Έμ΄λ€. μλ°λ λ€μ€ μμμ νμ©νμ§ μκ³ , ν΄λμ€ κ³μΈ΅κ΅¬μ‘°μλ λ―Ήμ€μΈμ μ½μ νκΈ°μ ν©λ¦¬μ μΈ μμΉκ° μκΈ° λλ¬Έμ΄λ€.
μ₯μ 3. μΈν°νμ΄μ€λ‘λ κ³μΈ΅κ΅¬μ‘°κ° μλ νμ νλ μμν¬λ₯Ό λ§λ€ μ μλ€. π₯
'λν - μ¬κ°ν - μ μ¬κ°ν'κ³Ό κ°μ΄ κ³μΈ΅ ꡬ쑰λ₯Ό μ½κ² ꡬλΆν μ μλ κ²λ μμ§λ§, νμ€μλ κ³μΈ΅μ μ격ν ꡬλΆνκΈ° μ΄λ €μ΄ κ°λ λ λ§λ€.
μλ₯Ό λ€μ΄, 'κ°μ' λλ 'μ곑κ°'λ₯Ό ꡬνν μλ μκ² μ§λ§, 'κ°μ'μ 'μ곑κ°'λ₯Ό λ λ€ κ΅¬νν μλ μλ€.
public interface Singer {
AudioClip sing(Song s);
}
----------
public interface Songwriter {
Song compose(int chartPosition);
}
----------
public interface SingerSongwriter extends Singer, Songwriter {
AudioClip strum();
void actSensitive();
}
μ₯μ 4. λνΌ ν΄λμ€ κ΄μ©κ΅¬μ ν¨κ» μ¬μ©νλ©΄ μΈν°νμ΄μ€λ κΈ°λ₯μ ν₯μ μν€λ μμ νκ³ κ°λ ₯ν μλ¨μ΄ λλ€. π§
μ΄ λΆλΆμ μμ΄ν 18(μμ보λ€λ μ»΄ν¬μ§μ μ μ¬μ©νλΌ)μμ λ€λ£¨μλ λ΄μ©μ΄λ€.
νμ μ μΆμ ν΄λμ€λ‘ μ μν΄ λλ©΄ κ·Έ νμ μ κΈ°λ₯μ μΆκ°νλ λ°©λ²μ μμλΏμ΄λ€. μμ΄ν 18μμ μ΄ν΄λ³Έ κ²μ²λΌ μλμ μ΄μ λ€λ‘ μΈν΄ μμμ μΊ‘μνλ₯Ό κΉ¨λ¨λ¦°λ€λ λ¬Έμ μ μ΄ μλ€.
- μμ ν΄λμ€κ° μ΄λ»κ² ꡬνλλλμ λ°λΌ νμ ν΄λμ€μ λμμ μ΄μμ΄ μκΈΈ μ μλ€.
- μμ ν΄λμ€μ μλ‘μ΄ λ©μλκ° μΆκ°λλ€λ©΄ νμ ν΄λμ€κ° κΉ¨μ§ μ μλ€.
κ·Έλ κΈ° λλ¬Έμ μλμ κ°μ΄ λνΌ ν΄λμ€ κ΄μ©κ΅¬μ ν¨κ» μ¬μ©νλ€λ©΄ μΈν°νμ΄μ€λ κΈ°λ₯μ ν₯μ μν€λ μμ νκ³ κ°λ ₯ν μλ¨μ΄ λλ€.
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(); }
}
μ₯μ 5. μΈν°νμ΄μ€μ λ©μλ μ€ κ΅¬ν λ°©λ²μ΄ λͺ λ°±ν κ²μ΄ μλ€λ©΄, κ·Έ ꡬνμ λν΄νΈ λ©μλλ‘ μ κ³΅ν΄ νλ‘κ·Έλλ¨Έλ€μ μΌκ°μ λμ΄μ€ μ μλ€. β
Collection.javaμ removeIfκ° μ’μ μμκ° λ μ μλ€.
public interface Collection<E> extends Iterable<E> {
default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean removed = false;
final Iterator<E> each = iterator();
while (each.hasNext()) {
if (filter.test(each.next())) {
each.remove();
removed = true;
}
}
return removed;
}
}
μ΄λ κ² λν΄νΈ λ©μλλ₯Ό μ 곡ν λλ μμνλ €λ μ¬λμ μν μ€λͺ μ @implSpec μλ°λ νκ·Έλ₯Ό λΆμ¬ λ¬Έμνν΄μΌ νλ€.
μ§κΈκΉμ§ μΈν°νμ΄μ€μ μ₯μ λ€μ μμ보μλ€. λ€μ κΈμμλ μΈν°νμ΄μ€μ μΆμ ν΄λμ€μ μ₯μ μ λͺ¨λ μ·¨νλ λ°©λ²μΈ 'μΆμ 골격 ꡬν(Skeletal Implementation) ν΄λμ€'λ₯Ό μμ보μ.
ν΄λΉ κΈμ λ°±κΈ°μ λμ 'μ΄νν°λΈ μλ° μλ²½ 곡λ΅'μ μ°Έκ³ νμμ΅λλ€.