Item 18. μμ λμ μ»΄ν¬μ§μ
μ μ¬μ©νλΌ
class MySet <E > extends HashSet <E > {
@ Override
public int size () {
return super .size ();
}
}
μμμ μΊ‘μνλ₯Ό κΉ¨νΈλ¦Ό
μμ ν΄λμ€μ λ΄λΆ ꡬνμ΄ λ¬λΌμ‘μ λ, μ΄ ν΄λμ€μ APIλ§μ μ΄μ©νλ μΈλΆ ν΄λΌμ΄μΈνΈλ μν₯μ λ°μ§ μμ
κ·Έλ¬λ μ΄λ₯Ό μμνλ νμ ν΄λμ€λ, λ΄λΆ ꡬν λ³κ²½μ μν΄ μν₯μ λ°μ μ μμ
μ? νμ ν΄λμ€μμλ μμ ν΄λμ€λ₯Ό μ€λ²λΌμ΄λ©ν μ μκ³ , μμ ν΄λμ€μμ λ΄λΆ ꡬν μ λ΄λΆμ λ©μλλ₯Ό νΈμΆνλ κ³Όμ μμ λ€λ₯Έ λ΄λΆ λ©μλλ₯Ό νΈμΆνκ² λλ©΄ μ€λ²λΌμ΄λ©λ λ©μλλ₯Ό νΈμΆνκ² λ¨
λ°λΌμ μκΈ°μ¬μ©(self-use) μ¬λΆμ λ°λΌ λμμ΄ λ¬λΌμ§ μ μμΌλ©°, μ΄λ λ΄λΆ ꡬν λ°©μμ ν΄λΉ
λν, μμ ν΄λμ€μ μλ‘μ΄ λ©μλκ° μΆκ°λκ±°λ νλ μ΄μ λ‘ λμμ΄ λ¬λΌμ§ μ μμ
ν΄κ²°μ±
κ³Ό λ€λ°λ₯΄λ λ¬Έμ μ λ€
μμ ν΄λμ€μ λ©μλλ₯Ό μ€λ²λΌμ΄λ©νλ κ³Όμ μμ superλ₯Ό νΈμΆνλ λμ μμ λμ μ체λ₯Ό μ¬μ μν μ μμΌλ, μ΄λ 볡μ‘νκ³ μ±λ₯ μ νλ₯Ό μΌμΌν¬ μ μμ
μμ μ΄λ¦λ§ κ°κ³ λ°ν νμ
/λ§€κ° μΈμκ° λ€λ₯Έ λ©μλλ₯Ό μλ‘ μ μΈν μ μμΌλ, μ΄ μμ μλμ λ¬Έμ μ λ€μ μΌκΈ°
μμ ν΄λμ€μ μ 릴리μ€μ μκ·Έλμ²κ° κ°κ³ λ°ν νμ
μ΄ λ€λ₯Έ λ©μλκ° μΆκ°λ¨ - μμ±ν λ©μλκ° λ¬΄μλ¨
μμ ν΄λμ€μ μ 릴리μ€μ μκ·Έλμ², λ°ν νμ
μ΄ λͺ¨λ κ°μ λ©μλκ° μΆκ°λ¨ - λ¨μ μ€λ²λΌμ΄λ©μ²λ¦¬λμ΄ μ€λμ μνμ΄ μμ
νμ ν΄λμ€μ μ¬μ μκ° μμ ν΄λμ€μ λμμλ μν₯μ λ―ΈμΉκ² λκΈ° λλ¬Έμ λ΄λΆ ꡬνμ μν₯μ λ°κ² λ¨
μμ ν΄λμ€μ νμ ν΄λμ€λ κ°νκ² μ°κ²°λλ©°, μμ ν΄λμ€μ μ λ³κ²½μ μ νμ ν΄λμ€λ ν° μν₯μ λ°μ
μ΄λ νμ ν΄λμ€κ° μ¬μ€μ μμ ν΄λμ€μ is-a κ΄κ³
κ° μλλ° μμνκΈ° λλ¬Έμ μ£Όλ‘ λ°μνλ λ¬Έμ λ€λ‘, μ΄λ¬ν κ²½μ°μλ μμ λμ μ»΄ν¬μ§μ
(Composition, ν©μ±)
μ μ΄μ©ν΄μΌ ν¨
class MySet <E > implements Set <E > {
private final Set <E > set ;
// Set μΈν°νμ΄μ€μ λ©μλλ€μ ꡬν
// ν¬μλ© λ°©μμ μ΄μ©
@ Override
public int size () {
return set .size ();
}
}
κΈ°μ‘΄ ν΄λμ€λ₯Ό νμ₯νλ λμ , μ΄ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό λ΄λΆ νλλ‘ μ°Έμ‘°νκ² νλ μ€κ³
μ ν΄λμ€λ κΈ°μ‘΄ ν΄λμ€μ λ©μλλ₯Ό νΈμΆνκ² λκ³ , μ΄λ₯Ό μ²λ¦¬λ₯Ό λκΈ΄λ€λ μλ―Έλ‘ μμ(delegation)
μ΄λΌκ³ λΆλ¦
λν, μ ν΄λμ€λ λ€λ₯Έ μΈμ€ν΄μ€λ₯Ό κ°μΈλ μν μ νλ€λ λ»μμ λνΌ(Wrapper) ν΄λμ€
λΌκ³ λΆλ¦
μμ κ°μ΄ μ»΄ν¬μ§μ
μ μ΄μ©νλ©΄, Set μΈν°νμ΄μ€λ₯Ό ꡬνν ꡬ체 ν΄λμ€λ₯Ό μμνλ λμ μ΄λ€ Setμ κΈ°λ₯μ΄λΌλ μ μ°νκ² μ΄μ©μ΄ κ°λ₯
MySetμ Setμ νΉμ ν κΈ°λ₯μ λ§μμΈ μ μλ ν΄λμ€λΌλ μ μμ λ°μ½λ μ΄ν°(Decorator) ν¨ν΄
μ μ΄μ©νλ€κ³ λ³Ό μ μμ
νμ ν΄λμ€κ° μμ ν΄λμ€μ μ νν is-a κ΄κ³
μΌ λμλ§ μμμ μ΄μ©ν μ μμ
리μ€μ½ν μΉν μμΉ(μλΈ νμ
μ μΈμ λ κΈ°λ° νμ
μΌλ‘ κ΅μ²΄ν μ μμ΄μΌ νλ€) μμ λν μ΄ μ μ κ°μ‘°νκ³ μμ
μ΄λ₯Ό λ§μ‘±νλ λ°©λ²μ, νμ ν΄λμ€λ₯Ό μμ ν΄λμ€λ‘ λ체νμ λ λͺ¨λ λμμ΄ μ μμ μΈκ°? λ₯Ό 보면 λ¨
κ·Έλ¬λ μμμ μ΄μ©νλ©΄ νμ ν΄λμ€λ μμ ν΄λμ€μ κ²°ν¨μ κ·Έλλ‘ λ¬Όλ €λ°κ² λλ©°, μμ ν΄λμ€κ° νμ₯μ κ³ λ €ν΄ μ€κ³λμ§ μμλ€λ©΄ μ€λ²λΌμ΄λ©ν λ©μλμ μν΄ λ€μν λ¬Έμ κ° λ°μν μ μμ
λ°λΌμ μμ λμ μ»΄ν¬μ§μ
μ μ¬μ©νλ νΈμ΄ λ μ μ°ν ν΄λμ€λ₯Ό μ μν μ μμ