item 20 Jung inchul - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
μλ°κ° μ 곡νλ λ€μ€ ꡬν λ©μ»€λμ¦
μ μΈν°νμ΄μ€
μ μΆμ ν΄λμ€
, μ΄λ κ² λ κ°μ§λ€. μλ°λ λ¨μΌ μμ
λ§ μ§μνλ, μΆμ ν΄λμ€ λ°©μμ μλ‘μ΄ νμ
μ μ μνλ λ° μ»€λ€λ μ μ½μ μκ² λλ μ
μ΄λ€. λ°λ©΄ μΈν°νμ΄μ€κ° μ μΈν λ©μλλ₯Ό λͺ¨λ μ μνκ³ κ·Έ μΌλ° κ·μ½μ μ μ§ν¨ ν΄λμ€λΌλ©΄ λ€λ₯Έ μ΄λ€ ν΄λμ€λ₯Ό μμ νλ κ°μ νμ
μΌλ‘ μ·¨κΈλλ€.
μλ° νλ«νΌμμλ Comparable
, Iterable
, AutoCloseable
μΈν°νμ΄μ€κ° μλ‘ μΆκ° λμ λ νμ€ λΌμ΄λΈλ¬λ¦¬μ μλ§μ κΈ°μ‘΄ ν΄λμ€κ° μ΄ μΈν°νμ΄μ€λ€μ ꡬνν μ± λ¦΄λ¦¬μ€λλ€.
μΈν°νμ΄μ€λ λ―Ήμ€μΈ(mixin)
μ μμ μμ±λ§μΆ€μ΄λ€. λ―Ήμ€μΈμ΄λ ν΄λμ€κ° ꡬνν μ μλ νμ
μΌλ‘, λ―Ήμ€μΈμ ꡬνν ν΄λμ€μ μλμ 'μ£Όλ νμ
'μΈμλ νΉμ μ νμ νμλ₯Ό μ 곡νλ€κ³ μ μΈνλ ν¨κ³Όλ₯Ό μ€λ€.
μΈν°νμ΄μ€λ‘λ κ³μΈ΅κ΅¬μ‘°
κ° μλ νμ
νλ μμν¬λ₯Ό λ§λ€ μ μλ€.
public interface Singer {
AudioClip sing(Song s);
}
public interface SongWriter {
Song compose(int chartPosition);
}
public interface SingerSongWriter extends Singer, Songwriter {
AudioClip sing(Song s);
Song compose(int chartPosition);
}
λνΌ ν΄λμ€λ κ΄μ©κ΅¬μ ν¨κΌ μ¬μ©νλ©΄ μΈν°νμ΄μ€λ κΈ°λ₯μ ν₯μ
μν€λ μμ
νκ³ κ°λ ₯ν μλ¨μ΄ λλ€.
μΈν°νμ΄μ€μ λ©μλ μ€ κ΅¬ν λ°©λ²μ΄ λͺ
λ°±ν κ²μ΄ μλ€λ©΄, κ·Έ ꡬνμ λν΄νΈ λ©μλ
λ‘ μ κ³΅ν΄ νλ‘κ·Έλλ¨Έλ€μ μΌκ°μ λμ΄μ€ μ μλ€. λν΄νΈ λ©μλλ₯Ό μ 곡ν λλ μμ νλ €λ μ¬λμ μν μ€λͺ
μ @implSpec
μλ°λ
νκ·Έλ₯Ό λΆμ¬ λ¬Έμνν΄μΌ νλ€.
μΈν°νμ΄μ€λ μΈμ€ν΄μ€ νλ
λ₯Ό κ°μ§ μ μκ³ publicμ΄ μλ μ μ λ©€λ²
λ κ°μ§ μ μλ€. λ§μ§λ§μΌλ‘ μ¬λ¬λΆμ΄ λ§λ€μ§ μμ μΈν°νμ΄μ€μλ λν΄νΈ λ©μλ
λ₯Ό μΆκ°ν μ μλ€.
μΈν°νμ΄μ€λ‘λ νμ
μ μ μνκ³ , νμνλ©΄ λν΄νΈ λ©μλ λͺ κ°λ ν¨κ» μ 곡νλ€. κ·Έλ¦¬κ³ κ³¨κ²© ꡬν ν΄λμ€
λ λλ¨Έμ§ λ©μλλ€ κΉμ§ ꡬννλ€. μ΄λ° μ¬μ© μ¬λ‘κ° ν
νλ¦Ώ λ©μλ ν¨ν΄
μ΄λ€.
ꡬ쑰μ 골격 ꡬνμ νμ₯νμ§ λͺ»νλ μ²μ§λΌλ©΄ μΈν°νμ΄μ€λ₯Ό μ§μ ꡬνν΄μΌ νλ€. μ΄λ° κ²½μ°λΌλ μΈν°νμ΄μ€κ° μ§μ μ 곡νλ λν΄νΈ λ©μλ
μ μ΄μ μ μ¬μ ν λ릴 μ μλ€. λν, 골격 ꡬν ν΄λμ€λ₯Ό μ°νμ μΌλ‘ μ΄μ©ν μλ μλ€. μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€μμ ν΄λΉ 골격 ꡬνμ νμ₯ν private λ΄λΆ ν΄λμ€
λ₯Ό μ μνκ³ , κ° λ©μλ νΈμΆμ λ΄λΆ ν΄λμ€μ μΈμ€ν΄μ€μ μ λ¬νλ κ²μ΄λ€.
ꡬ체μ μΈ μ¬λ‘κ° νμνλ€
λ¨μ ꡬν(simple implementation)
μ 골격 ꡬνμ μμ λ³μ’
μΌλ‘, AbstractMap.SimpleEntry
κ° μ’μ μλ€. λ¨μ ꡬνλ 골격 ꡬνκ³Ό κ°μ΄ μμμ μν΄ μΈν°νμ΄μ€λ₯Ό ꡬνν κ²μ΄μ§λ§, μΆμ ν΄λμ€κ° μλλ μ μ΄ λ€λ₯΄λ€. μ½κ² λ§ν΄ λμνλ κ°μ₯ λ¨μν ꡬνμ΄λ€. μ΄λ¬ν λ¨μ ꡬνμ κ·Έλλ‘ μ¨λ λκ³ νμμ λ§κ² νμ₯ν΄λ λλ€.
μ 리
μΌλ°μ μΌλ‘ λ€μ€ ꡬν
μ© νμ
μΌλ‘λ μΈν°νμ΄μ€
κ° κ°μ₯ μ ν©νλ€. 볡μ‘ν μΈν°νμ΄μ€ λΌλ©΄ ꡬννλ μκ³ λ₯Ό λμ΄μ£Όλ 골격 ꡬνμ ν¨κ» μ 곡νλ λ°©λ²μ κΌ κ³ λ € ν΄λ³΄μ. 골격 ꡬνμ 'κ°λ₯ν ν
' μΈν°νμ΄μ€μ λν΄νΈ λ©μλλ‘ μ 곡νμ¬ κ·Έ μΈν°νμ΄μ€λ₯Ό ꡬνν λͺ¨λ κ³³μμ νμ©νλλ‘ νλ κ²μ΄ μ’λ€. 'κ°λ₯ν ν
'μ΄λΌκ³ ν μ΄μ λ, μΈν°νμ΄μ€μ κ±Έλ € μλ ꡬνμμ μ μ½ λλ¬Έμ 골격 ꡬνμ μΆμ ν΄λμ€
λ‘ μ 곡νλ κ²½μ°κ° λ ννκΈ° λλ¬Έμ΄λ€.