π Chapter 13: μλΈν΄λμ±κ³Ό μλΈνμ΄ν
- μμμ 첫 λ²μ§Έ μ©λλ νμ κ³μΈ΅μ ꡬννλ κ²μ΄λ€. νμ κ³μΈ΅μ κ΄μ μμ λΆλͺ¨ ν΄λμ€λ μμ ν΄λμ€μ μΌλ°νμ΄κ³ μμ ν΄λμ€λ λΆλͺ¨ ν΄λμ€μ νΉμνλ€.
- μμμ λ λ²μ§Έ μ©λλ μ½λ μ¬μ¬μ©μ΄λ€. μμμ μ¬μ©νλ©΄ μ μ§μ μΌλ‘ μ ν리μΌμ΄μ μ κΈ°λ₯μ νμ₯ν μ μλ€. νμ§λ§ μ¬μ¬μ©μ μν΄ μμμ μ¬μ©ν κ²½μ° λΆλͺ¨ ν΄λμ€μ μμ ν΄λμ€κ° κ°νκ² κ²°ν©λκΈ° λλ¬Έμ λ³κ²½νκΈ° μ΄λ €μ΄ μ½λλ₯Ό μ»κ² λ νλ₯ μ΄ λλ€.
- μμμ μ¬μ©νλ μΌμ°¨μ μΈ λͺ©νλ μ½λ μ¬μ¬μ©μ΄ μλλΌ νμ κ³μΈ΅μ ꡬννλ κ²μ΄μ΄μΌ νλ€. νμ κ³μΈ΅μ λͺ©νλ‘ μμμ μ¬μ©νλ©΄ λ€νμ μΌλ‘ λμνλ κ°μ²΄λ€μ κ΄κ³μ κΈ°λ°ν΄ νμ₯ κ°λ₯νκ³ μ μ°ν μ€κ³λ₯Ό μ»μ μ μκ² λλ€.
- νμ μ¬μ΄μ κ΄κ³λ₯Ό κ³ λ €νμ§ μμ μ± λ¨μν μ½λλ₯Ό μ¬μ¬μ©νκΈ° μν΄ μμμ μ¬μ©ν΄μλ μ λλ€.
π νμ β
π κ°λ κ΄μ μ νμ β
- κ°λ κ΄μ μμ νμ μ΄λ μ°λ¦¬κ° μΈμ§νλ μΈμμ μ¬λ¬Όμ μ’ λ₯λ₯Ό μλ―Ένλ€. λ€μ λ§ν΄ μ°λ¦¬κ° μΈμνλ κ°μ²΄λ€μ μ μ©νλ κ°λ μ΄λ μμ΄λμ΄λ₯Ό κ°λ¦¬μΌ νμ μ΄λΌκ³ λΆλ₯Έλ€. νμ μ μ¬λ¬Όμ λΆλ₯νκΈ° μν νλ‘ μ¬μ©λλ€.
- μλ₯Ό λ€μ΄, μλ°, 루λΉ, μλ°μ€ν¬λ¦½νΈ, Cλ₯Ό νλ‘κ·Έλλ° μΈμ΄λΌκ³ λΆλ₯Ό λ μ΄κ²λ€μ νλ‘κ·Έλλ° μΈμ΄λΌλ νμ μΌλ‘ λΆλ₯νκ³ μλ κ²μ΄λ€.
- μ΄λ€ λμμ΄ νμ μΌλ‘ λΆλ₯λ λ κ·Έ λμμ νμ μ μΈμ€ν΄μ€λΌκ³ λΆλ₯Έλ€. (μλ°, 루λΉ, μλ°μ€ν¬λ¦½νΈλ νλ‘κ·Έλλ° μΈμ΄μ μΈμ€ν΄μ€λ€.) μΌλ°μ μΌλ‘ νμ μ μΈμ€ν΄μ€λ₯Ό κ°μ²΄λΌκ³ λΆλ₯Έλ€.
- μ¬λ³Ό(symbol)μ΄λ νμ μ μ΄λ¦μ λΆμΈ κ²μ΄λ€. (νλ‘κ·Έλλ° μΈμ΄κ° νμ μ μ¬λ³Όμ ν΄λΉνλ€.)
- λ΄μ°(intension)μ΄λ νμ μ μ μλ‘μ νμ μ μνλ κ°μ²΄λ€μ΄ κ°μ§λ 곡ν΅μ μΈ μμ±μ΄λ νλμ κ°λ¦¬ν¨λ€. (νλ‘κ·Έλλ° μΈμ΄μ μ μμΈ μ»΄ν¨ν°μκ² νΉμ ν μμ μ μ§μνκΈ° μν μ΄νμ λ¬Έλ²μ κ·μΉμ μ§ν©)
- μΈμ°(extension)μ΄λ νμ μ μνλ κ°μ²΄λ€μ μ§ν©μ΄λ€. (μλ°, 루λΉ, μλ°μ€ν¬λ¦½νΈ, C)
π νλ‘κ·Έλλ° μΈμ΄ κ΄μ μ νμ β
- νλ‘κ·Έλλ° μΈμ΄μ κ΄μ μμ νμ μ λΉνΈ λ¬Άμμ μλ―Έλ₯Ό λΆμ¬νκΈ° μν΄ μ μλ μ μ½κ³Ό κ·μΉμ κ°λ¦¬ν¨λ€.
- νλ‘κ·Έλλ° μΈμ΄μμ νμ
μ λ κ°μ§ λͺ©μ μ μν΄ μ¬μ©λλ€.
- νμ μ μνλ μ μλ μ ν¨ν μ€νΌλ μ΄μ μ μ§ν©μ μ μνλ€.
- νμ μ μνλλ μ€νΌλ μ΄μ μ λν΄ λ―Έλ¦¬ μ½μλ λ¬Έλ§₯μ μ 곡ν λ€.
- μ 리νλ©΄ νμ μ μ μ© κ°λ₯ν μ€νΌλ μ΄μ μ μ’ λ₯μ μλ―Έλ₯Ό μ μν¨μΌλ‘μ¨ μ½λμ μλ―Έλ₯Ό λͺ ννκ² μ λ¬νκ³ κ°λ°μμ μ€μλ₯Ό λ°©μ§νκΈ° μν΄ μ¬μ©λλ€.
π κ°μ²΄μ§ν₯ ν¨λ¬λ€μ κ΄μ μ νμ β
- κ°λ κ΄μ μμ νμ μ΄λ 곡ν΅μ νΉμ§μ 곡μ νλ λμλ€μ λΆλ₯λ€.
- νλ‘κ·Έλλ° μΈμ΄ κ΄μ μμ νμ μ΄λ λμΌν μ€νΌλ μ΄μ μ μ μ©ν μ μλ μΈμ€ν΄μ€λ€μ μ§ν©μ΄λ€.
- νλ‘κ·Έλλ° μΈμ΄μ κ΄μ μμ νΈμΆ κ°λ₯ν μ€νΌλ μ΄μ μ μ§ν©μ μ μνλ€. κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μμ μ€νΌλ μ΄μ μ κ°μ²΄κ° μμ ν μ μλ λ©μμ§λ₯Ό μλ―Ένλ€. λ°λΌμ κ°μ²΄μ νμ μ΄λ κ°μ²΄κ° μμ ν μ μλ λ©μμ§μ μ’ λ₯λ₯Ό μ μνλ κ²μ΄λ€.
- κ°μ²΄κ° μμ ν μ μλ λ©μμ§μ μ§ν©μ κ°λ¦¬ν€λ μ©μ΄λ‘ νΌλΈλ¦ μΈν°νμ΄μ€κ° κ·Έκ²μ΄λ€. μ¦, κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μμ νμ μ μ μνλ κ²μ κ°μ²΄μ νΌλΈλ¦ μΈν°νμ΄μ€λ₯Ό μ μνλ κ²κ³Ό λμΌνλ€.
- κ°μ²΄μ§ν₯μμ κ°μ²΄κ° μμ ν μ μλ λ©μμ§λ₯Ό κΈ°μ€μΌλ‘ νμ μ λΆλ₯νκΈ° λλ¬Έμ λμΌν νΌλΈλ¦ μΈν°νμ΄μ€λ₯Ό κ°μ§λ κ°μ²΄λ€μ λμΌν νμ μΌλ‘ λΆλ₯ν μ μλ€.
π νμ κ³μΈ΅β
π νμ μ¬μ΄μ ν¬ν¨κ΄κ³β
- νμ μ κ°μ²΄λ€μ μ§ν©μ΄κΈ° λλ¬Έμ λ€λ₯Έ νμ μ ν¬ν¨νλ κ²μ΄ κ°λ₯νλ€.
- νμ μμ ν¬ν¨λ κ°μ²΄λ€μ μ’ λ μμΈν κΈ°μ€μΌλ‘ λ¬Άμ΄ μλ‘μ΄ νμ μ μ μνλ©΄ μ΄ μλ‘μ΄ νμ μ μμ°μ€λ½κ² κΈ°μ‘΄ νμ μ λΆλΆμ§ν©μ΄ λλ€.
- μλ₯Ό λ€μ΄ μλ°, 루λΉ, μλ°μ€ν¬λ¦½νΈ Cλ νλ‘κ·Έλλ° μΈμ΄ νμ μ μΈμ€ν΄μ€μ΄λ―λ‘ νλ‘κ·Έλλ° μΈμ΄ μ§ν©μ μμλ‘ ννν μ μλ€. μ΄ μ§ν©μ μμλ₯Ό λ μμΈνκ² λΆλ₯ν μ μλ€. μλ°, 루λΉ, μλ°μ€ν¬λ¦½νΈλ κ°μ²΄μ§ν₯ μΈμ΄κ³ Cλ μ μ°¨μ μΈμ΄λ‘ λΆλ₯ν μ μλ€. λ λμκ° μλ°μ 루λΉλ ν΄λμ€ κΈ°λ° μΈμ΄λ‘, μλ°μ€ν¬λ¦½νΈλ νλ‘ν νμ κΈ°λ° μΈμ΄λ‘ λΆλ₯ν μ μλ€.
- μ¬κΈ°μ μλ°λ νλ‘κ·Έλλ° μΈμ΄μΈ λμμ κ°μ²΄μ§ν₯ μΈμ΄μ μνλ©° λ μΈλΆμ μΌλ‘ ν΄λμ€ κΈ°λ° μΈμ΄ νμ μ μνκ² λλ κ²μ΄λ€.
- λ€λ₯Έ νμ μ ν¬ν¨νλ νμ μ ν¬ν¨νλ νμ λ³΄λ€ μ’ λ μΌλ°νλ μλ―Έλ₯Ό ννν μ μλ€. λ°λ©΄ ν¬ν¨λλ νμ μ μ’ λ νΉμνκ³ κ΅¬μ²΄μ μ΄λ€.
- λ€λ₯Έ νμ μ ν¬ν¨νλ νμ μ ν¬ν¨λλ νμ λ³΄λ€ λ λ§μ μΈμ€ν΄μ€λ₯Ό κ°μ§λ€.
- λ€μ λ§ν΄μ ν¬ν¨λλ νμ μ μΈμ° κ΄μ μμλ λ ν¬κ³ λ΄μ° κ΄μ μμλ λ μΌλ°μ μ΄λ€. μ΄μ λ°λλ‘ ν¬ν¨λλ νμ μ μΈμ° κ΄μ μμλ λ μκ³ λ΄μ° κ΄μ μμλ λ νΉμνλ€. μ΄κ²μ ν¬ν¨ κ΄κ³λ‘ μ°κ²°λ νμ μ¬μ΄μ κ°λ μ μΌλ‘ μΌλ°νμ νΉμν κ΄κ³κ° μ‘΄μ¬νλ€λ κ²μ μλ―Ένλ€.
- νμ κ³μΈ΅μ ꡬμ±νλ λ νμ κ°μ κ΄μ μμ λ μΌλ°μ μΈ νμ μ μνΌνμ (supertype)μ΄λΌκ³ λΆλ₯΄κ³ λ νΉμν νμ μ μλΈνμ (subtype)μ΄λΌκ³ λΆλ₯Έλ€.
- κ°μ²΄μ μ μλ₯Ό μλ―Ένλ λ΄μ° κ΄μ μμ μΌλ°νλ μ΄λ€ νμ μ μ μλ₯Ό μ’ λ 보νΈμ μ΄κ³ μΆμμ μΌλ‘ λ§λλ κ³Όμ μ μλ―Ένλ€. λ°λλ‘ νΉμνλ μ΄λ€ νμ μ μ μλ₯Ό μ’ λ ꡬ체μ μ΄κ³ λ¬Έλ§₯ μ’ μμ μΌλ‘ λ§λλ κ³Όμ μ μλ―Ένλ€.
- μ§ν©μ μλ―Ένλ μΈμ°μ κ΄μ μμ μΌλ°μ μΈ νμ μ μΈμ€ν΄μ€ μ§ν©μ νΉμν νμ μ μΈμ€ν΄μ€ μ§ν©μ ν¬ν¨νλ μνΌμ μ΄λ€. λ°λλ‘ νΉμν νμ μ μΈμ€ν΄μ€ μ§ν©μ μΌλ°μ μΈ νμ μ μΈμ€ν΄μ€ μ§ν©μ ν¬ν¨λ μλΈμ μ΄λ€. λ°λΌμ νΉμν νμ μ μν μΈμ€ν΄μ€λ λμμ λ μΌλ°μ μΈ νμ μ μΈμ€ν΄μ€μ΄κΈ°λ νλ€.
- μΌλ°νλ λ€λ₯Έ νμ μ μμ ν ν¬ν¨νκ±°λ λ΄ν¬νλ νμ μ μλ³νλ νμ λλ κ·Έ νμμ κ²°κ³Όλ₯Ό κ°λ¦¬ν¨λ€.
- νΉμνλ λ€λ₯Έ νμ μμ μ 체μ μΌλ‘ ν¬ν¨λκ±°λ μμ ν λ΄ν¬λλ νμ μ μλ³νλ νμ λλ κ·Έ νμμ κ²°κ³Όλ₯Ό κ°λ¦¬ν¨λ€.
- λ΄μ°κ³Ό μΈμ° κ΄μ μμ μλΈνμ
κ³Ό μνΌνμ
μ λ€μκ³Ό κ°μ΄ μ μν μ μλ€.
- μνΌνμ
μ λ€μκ³Ό κ°μ νΉμ§μ κ°μ§λ νμ
μ κ°λ¦¬ν¨λ€.
- μ§ν©μ΄ λ€λ₯Έ μ§ν©μ λͺ¨λ λ©€λ²λ₯Ό ν¬ν¨νλ€.
- νμ μ μκ° λ€λ₯Έ νμ λ³΄λ€ μ’ λ μΌλ°μ μ΄λ€.
- μλΈνμ
μ λ€μκ³Ό κ°μ νΉμ§μ κ°μ§λ νμ
μ κ°λ¦¬ν¨λ€.
- μ§ν©μ ν¬ν¨λλ μΈμ€ν΄μ€λ€μ΄ λ ν° μ§ν©μ ν¬ν¨λλ€.
- νμ μ μκ° λ€λ₯Έ νμ λ³΄λ€ μ’ λ ꡬ체μ μ΄λ€.
- μνΌνμ
μ λ€μκ³Ό κ°μ νΉμ§μ κ°μ§λ νμ
μ κ°λ¦¬ν¨λ€.
π κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°κ³Ό νμ κ³μΈ΅β
- κ°μ²΄μ νμ μ κ²°μ νλ κ²μ νΌλΈλ¦ μΈν°νμ΄μ€λ€.
- μΌλ°μ μΈ νμ μ΄λ λΉκ΅νλ €λ νμ μ μν κ°μ²΄λ€μ νΌλΈλ¦ μΈν°νμ΄μ€λ³΄λ€ λ μΌλ°μ μΈ νΌλΈλ¦ μΈν°νμ΄μ€λ₯Ό κ°μ§λ κ°μ²΄λ€μ νμ μ μλ―Ένλ€.
- νΉμν νμ μ΄λ λΉκ΅νλ €λ νμ μ μν κ°μ²΄λ€μ νΌλΈλ¦ μΈν°νμ΄μ€λ³΄λ€ λ νΉμν νΌλΈλ¦ μΈν°νμ΄μ€λ₯Ό κ°μ§λ κ°μ²΄λ€μ νμ μ μλ―Ένλ€.
- μνΌνμ μ΄λ μλΈνμ μ΄ μ μν νΌλΈλ¦ μΈν°νμ΄μ€λ₯Ό μΌλ°νμμΌ μλμ μΌλ‘ λ²μ©μ μ΄κ³ λμ μλ―Έλ‘ μ μν κ²μ΄λ€.
- μλΈνμ μ΄λ μνΌνμ μ΄ μ μν νΌλΈλ¦ μΈν°νμ΄μ€λ₯Ό νΉμνμμΌ μλμ μΌλ‘ ꡬ체μ μ΄κ³ μ’μ μλ―Έλ‘ μ μν κ²μ΄λ€.
- μλΈνμ μ μΈμ€ν΄μ€λ μνΌνμ μ μΈμ€ν΄μ€λ‘ κ°μ£Όλ μ μλ€.
π μλΈν΄λμ±κ³Ό μλΈνμ΄νβ
π μΈμ μμμ μ¬μ©ν΄μΌ νλκ°?β
- λ€μ λ μ§λ¬Έμ λͺ¨λ μλΌκ³ λ΅ν μ μλ κ²½μ°μλ§ μμμ μ¬μ©ν΄μΌ νλ€.
- μμ κ΄κ³κ°
is-a
κ΄κ³λ₯Ό λͺ¨λΈλ§νλκ°? (μμ ν΄λμ€λ λΆλͺ¨ν΄λμ€λ€.) - ν΄λΌμ΄μΈνΈ μ μ₯μμ λΆλͺ¨ ν΄λμ€μ νμ μΌλ‘ μμν΄λμ€λ₯Ό μ¬μ©ν΄λ 무방νκ°? (μμ κ³μΈ΅μ μ¬μ©νλ ν΄λΌμ΄μΈνΈμ μ μ₯μμ λΆλͺ¨ ν΄λμ€μ μμ ν΄λμ€μ μ°¨μ΄μ μ λͺ°λΌμΌ νλ€. μ΄ λ μ¬μ΄μ νλ νΈνμ±μ΄λΌ λΆλ₯Έλ€.)
- μμ κ΄κ³κ°
π is-a κ΄κ³β
- μ΄λ€ νμ Sκ° λ€λ₯Έ νμ Tμ μΌμ’ μ΄λΌλ©΄ λΉμ°ν νμ Sλ νμ Tλ€λΌκ³ λ§ν μ μμ΄μΌ νλ€. (κ°μ²΄μ§ν₯ μΈμ΄λ νλ‘κ·Έλλ° μΈμ΄λ€.)
- νμ§λ§
is-a
κ΄κ³κ° μ§κ΄μ μ΄κ³ λͺ μΎν κ²μ μλλ€.- νκ·μ μλ€.
- μλ λ μ μλ€.
public class Bird {
public void fiy() {...}
}
public class Penguin extends Bird { // νκ·μ λ μ μλ€.
// ...
}
- μ΄ μλ μ΄νμ μΈ μ μκ° μλλΌ κΈ°λλλ νλμ λ°λΌ νμ κ³μΈ΅μ ꡬμ±ν΄μΌ νλ€λ μ¬μ€μ μ 보μ¬μ€λ€.
- λ°λΌμ νμ
κ³μΈ΅μ μλ―Έλ νλμ΄λΌλ λ¬Έλ§₯μ λ°λΌ λ¬λΌμ§ μ μλ€. κ·Έμ λ°λΌ μ¬λ°λ₯Έ νμ
κ³μΈ΅μ΄λΌλ μλ―Έ μμ λ¬Έλ§₯μ λ°λΌ λ¬λΌμ§ μ μλ€. λ°λΌμ μνΌνμ
κ³Ό μλΈνμ
κ΄κ³μμλ
is-a
λ³΄λ€ νλ νΈνμ±μ΄ λ μ€μνλ€.
π νλ νΈνμ±β
- νμ
μ μ΄λ¦ μ¬μ΄μ κ°λ
μ μΌλ‘ μ΄λ€ μ°κ΄μ±μ΄ μλ€κ³ νλλΌλ νλμ μ°κ΄μ±μ΄ μλ€λ©΄
is-a
κ΄κ³λ₯Ό μ¬μ©νμ§ λ§μμΌ νλ€. - λ νμ μ¬μ΄μ νλμ΄ νΈνλ κ²½μ°μλ§ νμ κ³μΈ΅μΌλ‘ λ¬Άμ΄μΌ νλ€. νλμ νΈν μ¬λΆλ₯Ό νλ¨νλ κΈ°μ€μ ν΄λΌμ΄μΈνΈμ κ΄μ μ΄λ€. ν΄λΌμ΄μΈνΈκ° λ νμ μ΄ λμΌνκ² νλν κ²μ΄λΌκ³ κΈ°λνλ€λ©΄ λ νμ μ νμ κ³μΈ΅μΌλ‘ λ¬Άμ μ μλ€. νμ κ³μΈ΅μ μ΄ν΄νκΈ° μν΄μλ κ·Έ νμ κ³μΈ΅μ΄ μ¬μ©λ λ¬Έ λ§₯μ μ΄ν΄νλ κ²μ΄ μ€μνλ€.
- λ€μκ³Ό κ°μ΄ ν΄λΌμ΄μΈνΈκ° λ μ μλ μλ§μ μνλ€κ³ κ°μ ν΄λ³Έλ€.
public void flyBird(Bird bird) {
// μΈμλ‘ μ λ¬λ λͺ¨λ birdλ λ μ μμ΄μΌ νλ€.
bird.fly();
}
Penguin
μ ν΄λΌμ΄μΈνΈμ κΈ°λλ₯Ό μ λ²λ¦¬κΈ° λλ¬ΈμBird
μ μλΈνμ μ΄ μλλ€. λ°λΌμ μ΄ λμ μμ κ΄κΌλ‘ μ°κ²°ν μ μ€κ³λ μμ λΌμΌ νλ€. μμ κ΄κ³λ₯Ό μ μ§νλ©΄μ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ μλν΄ λ³Ό μ μλ μΈ κ°μ§ λ°©λ²μ΄ μλ€.- 첫 λ²μ§Έ λ°©λ²μ
Penguin
μfly
λ©μλλ₯Ό μ€λ²λΌμ΄λ©ν΄μ λ΄λΆ ꡬνμ λΉμλλ κ²μ΄λ€.
public class Penguin extends Bird {
// ...
@Override
public void fly() {}
}
- νμ§λ§ μ΄ λ°©λ²μ μ΄λ€ νλλ μννμ§ μκΈ° λλ¬Έμ λͺ¨λ
bird
κ° λ μ μλ€λ ν΄λΌμ΄μΈνΈμ κΈ°λλ₯Ό λ§μ‘±μν€μ§ λͺ»νλ€. λ°λΌμ μ¬λ°λ₯Έ μ€κ³κ° μλλ€. - λ λ²μ§Έ λ°©λ²μ
Penguin
μfly
λ©μλλ₯Ό μ€λ²λΌμ΄λ©ν ν μμΈλ₯Ό λμ§λ€.
public class Penguin extends Bird {
// ...
@Override
public void fly() {
throw new UnsupportedOperationException();
}
}
- νμ§λ§ μ΄ κ²½μ°μλ
flyBird
λ©μλμ μ λ¬λλ μΈμλ₯Ό νμ μ λ°λΌ λ©μλκ° μ€ν¨νκ±°λ μ±κ³΅νκ² λλ€. - μΈ λ²μ§Έ λ°©λ²μ
flyBird
λ©μλλ₯Ό μμ ν΄μ μΈμλ‘ μ λ¬λbird
μ νμ μ΄Penguin
μ΄ μλ κ²½μ°μλ§fly
λ©μμ§λ₯Ό μ μ‘νλλ‘ νλ€.
public void flyBird(Bird bird) {
// μΈμλ‘ μ λ¬λ λͺ¨λ birdκ° Penguinμ μΈμ€ν΄μ€κ° μλ κ²½μ°μλ§
// fly() λ©μμ§λ₯Ό μ μ‘νλ€.
if (!(bird instanceof Penguin)) {
bird.fly();
}
}
- νμ§λ§ μ΄ κ²½μ°μλ λ§μ½
Penguin
μ΄μΈμ λ μ μλ λ λ€λ₯Έ μκ° μμ κ³μΈ΅μ μΆκ°λλ€λ©΄ μλ‘μ΄ νμ μ 체ν¬νλ μ½λλ₯Ό μΆκ°ν΄μΌ νλ€. κ°λ°©-νμ μμΉμ μλ°νλ€.
π ν΄λΌμ΄μΈνΈμ κΈ°λμ λ°λΌ κ³μΈ΅ λΆλ¦¬νκΈ°β
- λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ λ°©λ²μ ν΄λΌμ΄μΈνΈμ κΈ°λμ λ§κ² μμ κ³μΈ΅μ λΆλ¦¬νλ κ²μ΄λ€.
- λ μ μλ μμ λ μ μλ μλ₯Ό λͺ ννκ² κ΅¬λΆν μ μκ² μμ κ³μΈ΅μ λΆλ¦¬νλ©΄ μλ‘ λ€λ₯Έ μꡬμ¬νμ κ°μ§ ν΄λΌμ΄μΈνΈλ₯Ό λ§μ‘±μν¬ μ μλ€.
public class Bird {
// ...
}
public class FlyingBird extends Bird {
public void fly() {...}
}
public class Penguin extends Bird {
// ...
}
- μ΄μ
flyBird
λ©μλλFlyingBird
νμ μ μ΄μ©ν΄ λ μ μλ μλ§ μΈμλ‘ μ λ¬λΌμΌ νλ€λ μ¬μ€μ μ½λμ λͺ μν μ μλ€.
public void flyBird(FlyingBird bird) {
bird.fly();
}
- μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ λ€λ₯Έ λ°©λ²μ ν΄λΌμ΄μΈνΈμ λ°λΌ μΈν°νμ΄μ€λ₯Ό λΆλ¦¬νλ κ²μ΄λ€. μΈν°νμ΄μ€λ ν΄λΌμ΄μΈνΈκ° κΈ°λνλ λ°μ λ°λΌ λΆλ¦¬λΌμΌ νλ€. ν΄λΌμ΄μΈνΈμ λ°λΌ μΈν°νμ΄μ€λ₯Ό λΆλ¦¬νλ©΄ λ³κ²½μ λν μν₯μ λ μΈλ°νκ² μ μ΄ν μ μκ² λλ€.
- μΈν°νμ΄μ€λ₯Ό ν΄λΌμ΄μΈνΈμ κΈ°λμ λ°λΌ λΆλ¦¬ν¨μΌλ‘μ¨ λ³κ²½μ μν΄ μν₯μ μ μ΄νλ μ€κ³ μμΉμ μΈν°νμ΄μ€ λΆλ¦¬ μμΉ(ISP)μ΄λΌκ³ λΆλ₯Έλ€.
π μλΈν΄λμ±κ³Ό μλΈνμ΄νβ
- μμμ λ κ°μ§ λͺ©μ μ μ½λ μ¬μ¬μμ μν΄μκ³ , λ€λ₯Έ νλλ νμ κ³μΈ΅μ ꡬμ±νκΈ° μν΄μλ€.
- μμμ μ¬μ©νλ λ κ°μ§ λͺ©μ μ νΉλ³ν μ΄λ¦μ λΆμλλ° μλΈν΄λμ±κ³Ό μλΈνμ΄νμ΄ κ·Έκ²μ΄λ€.
μλΈν΄λμ±(subclassing)
- λ€λ₯Έ ν΄λμ€μ μ½λλ₯Ό μ¬μ¬μ©ν λͺ©μ μΌλ‘ μμμ μ¬μ©νλ κ²½μ°λ₯Ό κ°λ¦¬ν¨λ€. μμ ν΄λμ€μ λΆλͺ¨ ν΄λμ€μ ν΄λμ΄ νΈνλμ§ μκΈ° λλ¬Έμ μμ ν΄λμ€μ μΈμ€ν΄μ€κ° λΆλͺ¨ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό λ체ν μ μλ€.
- μλΈν΄λμ±μ ꡬν μμλλ ν΄λμ€ μμμ΄λΌκ³ λΆλ₯Έλ€.
μλΈνμ΄ν(subtyping)
- νμ κ³μΈ΅μ ꡬμ±νκΈ° μν΄ μμμ μ¬μ©νλ κ²½μ°λ₯Ό κ°λ¦¬ν¨λ€. μμ ν΄λμ€μ λΆλͺ¨ ν΄λμ€μ νλμ΄ νΈνλκΈ° λλ¬Έμ μμ ν΄λμ€μ μΈμ€ν΄μ€κ° λΆλͺ¨ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό λ체ν μ μλ€. μ΄λ λΆλͺ¨ ν΄λμ€λ μμ ν΄λμ€μ μνΌνμ μ΄ λκ³ μμ ν΄λμ€λ λΆλͺ¨ ν΄λμ€μ μλΈνμ μ΄ λλ€.
- μλΈνμ΄νμ μΈν°νμ΄μ€ μμμ΄λΌκ³ λΆλ₯΄κΈ°λ νλ€.
- μλΈν΄λμ±κ³Ό μλΈνμ΄νμ λλλ κΈ°μ€μ μμμ μ¬μ©νλ λͺ©μ μ΄λ€.
- μλΈνμ΄ν κ΄κ³κ° μ μ§λκΈ° μν΄μλ μλΈνμ μ΄ μνΌνμ μ΄ νλ λͺ¨λ νλμ λμΌνκ² ν μ μμ΄μΌ νλ€. μ¦, μ΄λ€ νμ μ΄ λ€λ₯Έ νμ μ μλΈνμ μ΄ λκΈ° μν΄μλ νλ νΈνμ±μ λ§μ‘±μμΌμΌ ν λ€.
- μμ ν΄λμ€μ λΆλͺ¨ ν΄λμ€ μ¬μ΄μ νλ νΈνμ±μ λΆλͺ¨ ν΄λμ€μ λν μμ ν΄λμ€μ λ체 κ°λ₯μ±μ ν¬ν¨νλ€.
π 리μ€μ½ν μΉν μμΉβ
- 리μ€μ½ν μΉν μμΉ(LSP)λ μλΈνμ μ κ·Έκ²μ κΈ°λ° νμ μ λν΄ λ체 κ°λ₯ν΄μΌνλ€λ κ²μΌλ‘ ν΄λΌμ΄μΈνΈκ° μ°¨μ΄μ μ μΈμνμ§ λͺ»ν μ± κΈ°λ° ν΄λμ€μ μΈν°νμ΄μ€λ₯Ό ν΅ν΄ μλΈν΄λμ€λ₯Ό μ¬μ©ν μ μμ΄μΌ νλ€.
- 리μ€μ½ν μΉν μμΉμ λ°λ₯΄λ©΄ μμ ν΄λμ€κ° λΆλͺ¨ ν΄λμ€μ νλ νΈνμ±μ μ μ§ν¨μΌλ‘μ¨ λΆλͺ¨ ν΄λμ€λ₯Ό λ체ν μ μλλ‘ κ΅¬νλ μμ κ΄κ³λ§μ μλΈνμ΄νμ΄λΌκ³ λΆλ¬μΌ νλ€.
- μ΄λ² μμ λ μ μ¬κ°νμ μ§μ¬κ°νμ΄λ€λΌλ μ΄μΌκΈ°μ΄λ€. νμ§λ§ μ μ¬κ°νμ μ§μ¬κ°νμ΄ μλ μ μλ€. μ΄ μμ κ΄κ³λ 리μ€μ½ν μΉν μμΉμ μλ°νλ κ³ μ μ μΈ μ¬λ‘ μ€ νλλ€.
- μλλ μ§μ¬κ°νμ ꡬνν
Rectangle
μ΄λ€.
public class Rectangle {
private int x, y, width, height;
public Rectangle(int x, int y, int width, int height) {
this.x = x; // μΌμͺ½ μλ¨ λͺ¨μ리 μμΉ (x, y)
this.y = y;
this.width = width; // λλΉ
this.height = height; // λμ΄
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getArea() {
return width * height;
}
}
- μ μ¬κ°νμ μ§μ¬κ°νμ νΉμν κ²½μ°μ΄κ³ μ§μ¬κ°νμ μ μ¬κ°νμ μΌλ°μ μΈ κ²½μ°μ΄κΈ° λλ¬Έμ μ μ¬κ°νκ³Ό μ§μ¬κ°νμ μ¬μ΄μ μ΄νμ μΌλ‘
is-a
κ΄κ³κ° μ±λ¦½νλ€. - μ μ¬κ°νμ λλΉμ λμ΄κ° λμΌν΄μΌ νλ€.
public class Square extends Rectangle {
public Square(int x, int y, int size) {
super(x, y, size, size);
}
@Override
public void setWidth(int width) {
super.setWidth(width);
super.setHeight(width);
}
@Override
public void setHeight(int height) {
super.setWidth(height);
super.setHeight(height);
}
}
Square
λRectangle
μ μμ ν΄λμ€μ΄κΈ° λλ¬ΈμRectangle
μ΄ μ¬μ©λλ λͺ¨λ κ³³μμRectangle
λ‘ μ μΊμ€ν λ μ μλ€. λ¬Έμ λRectangle
κ³Ό νλ ₯νλ ν΄λΌμ΄μΈνΈλ μ§μ¬κ°ν λλΉμ λμ΄κ° λ€λ₯΄λ€κ³ κ°μ‘ν λ λ°μνλ€. λ°λΌμ μλ μ½λμ²λΌ μ§μ¬κ°νμ λλΉμ λμ΄λ₯Ό μλ‘ λ€λ₯΄κ² μ€μ νλλ‘ νλ‘κ·Έλλ°ν κ²μ΄λ€.
public void resize(Rectangle rectangle, int width, int height) {
rectangle.setWidth(width);
rectangle.setHeight(height);
assert rectangle.getWidth() === width && rectangle.getHeight() === height;
}
- κ·Έλ¬λ
resize
λ©μλμ μΈμλ‘Square
λ₯Ό μ λ¬νλ€κ³ κ°μ ν΄λ³΄λ©΄, λ λμ€μ μ€μ λheight
μ κ°μΌλ‘ κ°μμ§κ² λλ€. λ°λΌμ λ€μκ³Ό κ°μ΄width
μheight
κ°μ λ€λ₯΄κ² μ€μ ν κ²½μ° λ©μλ μ€νμ μ€ν¨νκ³ λ§ κ²μ΄λ€.
Square square = new Square(10, 10, 10);
resize.(square, 50, 100);
resize
λ©μλμ κ΄μ γ΄μμRectangle
λμSquare
λ₯Ό μ¬μ©ν μ μκΈ° λλ¬ΈμSquare
λRectangle
μ΄ μλλ€. λ ν΄λμ€λ ꡬνμ μ¬μ¬μ©νκ³ μμ λΏμ΄κΈ° λλ¬Έμ 리μ€μ½ν μΉν μμΉμ μλ°νλ€. λ°λΌμ μλΈνμ΄ν κ΄κ³κ° μλλΌ μλΈν΄λμ± κ΄κ³λ€.
π ν΄λΌμ΄μΈνΈμ λ체 κ°λ₯μ±β
- ν΄λΌμ΄μΈνΈ μ
μ₯μμ μ μ¬κ°νμ μΆμνν
Square
λ μ§μ¬κ°νμ μΆμννRectangle
κ³Ό λμΌνμ§ μλ€. - 리μ€μ½ν μΉν μμΉμ μμ ν΄λμ€κ° λΆλͺ¨ ν΄λμ€λ₯Ό λ체νκΈ° μν΄μλ λΆλͺ¨ ν΄λμ€μ λν ν΄λΌμ΄μΈνΈμ κ°μ μ μ€μν΄μΌ νλ€λ κ²μ κ°μ‘°νλ€.
- 리μ€μ½ν μΉν μμΉμ μμ κ΄κ³μ μλ λ ν΄λμ€ μ¬μ΄μ κ΄κ³λ₯Ό ν΄λΌμ΄μΈνΈμ λ¨μ΄νΈλ € λκ³ νλ¨νμ§ λ§μμΌ νλ€. μμ κ΄κ³λ ν΄λΌμ΄μΈνΈμ κ΄μ μμ μμ ν΄λμ€μ λΆλͺ¨ ν΄λμ€λ₯Ό λ체ν μ μμ λλ§ μ¬λ°λ₯΄λ€.
- λ체 κ°λ₯μ±μ κ²°μ νλ κ²μ ν΄λΌμ΄μΈνΈλ€.
π is-a κ΄κ³ λ€μ μ΄ν΄λ³΄κΈ°β
- ν΄λΌμ΄μΈνΈ κ΄μ μμ μμ ν΄λμ€μ νλμ΄ λΆλͺ¨ ν΄λμ€μ νλκ³Ό νΈνλμ§ μκ³ κ·Έλ‘ μΈν΄ λμ²΄κ° λΆκ°λ₯νλ€λ©΄ μ΄νμ μΌλ‘
is-a
λΌκ³ λ§ν μ μλ€κ³ νλλΌλ κ·Έ κ΄κ³λ₯Όis-a
κ΄κ³λΌκ³ ν μ μλ€. is-a
λ ν΄λΌμ΄μΈνΈ κ΄μ μμis-a
μΌ λλ§ μ°Έμ΄λ€. ν΄λΌμ΄μΈνΈκ° μ΄ λμ λμΌνκ² μ·¨κΈν μ μμ λλ§ κ·Έλ λ€. (ν΄λΌμ΄μΈνΈ μ μ₯μμ μ μ¬κ°νμ μ§μ¬κ°νμΈκ°? ν΄λΌμ΄μΈνΈ μ μ₯μμ νκ·μ μμΈκ°?)is-a
κ΄κ³λ κ°μ²΄μ§ν₯μμ μ€μν κ²μ κ°μ²΄μ μμ±μ΄ μλλΌ κ°μ²΄μ νλμ΄λΌλ μ μ κ°μ‘°νλ€.- μνΌνμ
κ³Ό μλΈνμ
μ΄ ν΄λΌμ΄μΈνΈ μ
μ₯μμ νλμ΄ νΈνλλ€λ©΄ λ νμ
μ
is-a
λ‘ μ°κ²°ν΄ λ¬Έμ₯μ λ§λ€μ΄λ μ΄μνμ§ μμ λ¨μ΄λ‘ νμ μ μ΄λ¦μ μ νλΌλ κ²μ΄λ€. - κ²°λ‘ μ μΌλ‘ μμμ΄ μλΈνμ΄νμ μν΄ μ¬μ©λ κ²½μ°μλ§
is-a
κ΄κ³λ€.
π 리μ€μ½ν μΉν μμΉμ μ μ°ν μ€κ³μ κΈ°λ°μ΄λ€.β
- μλ‘μ΄ μμ ν΄λμ€λ₯Ό μΆκ°νλλΌλ ν΄λΌμ΄μΈνΈ μ μ₯μμ λμΌνκ² νλνκΈ°λ§ νλ€λ©΄ ν΄λΌμ΄μΈνΈλ₯Ό μμ νμ§ μκ³ λ μμ κ³μΈ΅μ νμ₯ν μ μλ€.
- 리μ€μ½ν μΉν μμΉμ λ°λ₯΄λ μ€κ³λ μ μ°ν λΏλ§ μλλΌ νμ₯μ±μ΄ λλ€.
- 리μ€μ½ν μΉν μμΉμ κ°λ°©-νμ μμΉμ λ§μ‘±νλ μ€κ³λ₯Ό μν μ μ 쑰건μ΄λ€.
π νμ κ³μΈ΅κ³Ό 리μ€μ½ν μΉν μμΉβ
- ꡬν λ°©λ²κ³Ό 무κ΄νκ² ν΄λΌμ΄μΈνΈμ κ΄μ μμ μνΌνμ μ λν΄ κΈ°λνλ λͺ¨λ κ²μ΄ μλΈνμ μκ²λ μ μ©λΌμΌ νλ€λ κ²μ΄λ€.
π κ³μ½μ μν μ€κ³μ μλΈνμ΄νβ
- ν΄λΌμ΄μΈνΈμ μλ² μ¬μ΄μ νλ ₯μ μ무μ μ΄μ΅μΌλ‘ ꡬμ±λ κ³μ½μ κ΄μ μμ νννλ κ²μ κ³μ½μ μν μ€κ³(DBC)λΌκ³ λΆλ₯Έλ€.
- κ³μ½μ μν μ€κ³λ ν΄λΌμ΄μΈνΈκ° μ μμ μΌλ‘ λ©μλλ₯Ό μ€ννκΈ° μν΄ λ§μ‘±μμΌμΌ νλ μ¬μ 쑰건과 λ©μλκ° μ€νλ νμ μλ²κ° ν΄λΌμ΄μΈνΈμκ² λ³΄μ₯ν΄μΌνλ μ¬ν쑰건, λ©μλ μ€ν μ κ³Ό μ€ν νμ μΈμ€ν΄μ€κ° λ§μ‘±μμΌμΌ νλ ν΄λμ€ λΆλ³μμ μΈ κ°μ§ μμλ‘ κ΅¬μ±λλ€.
- κ³μ½μ μν μ€κ³λ₯Ό μ¬μ©νλ©΄ 리μ€μ½ν μΉν μμΉμ΄ κ°μ νλ 쑰건μ κ³μ½μ κ°λ μ μ΄μ©ν΄ μ’ λ λͺ ννκ² μ€λͺ ν μ μλ€.
μλΈνμ μ΄ λ¦¬μ€μ½ν μΉν μμΉμ λ§μ‘±μν€κΈ° μν΄μλ ν΄λΌμ΄μΈνΈμ μνΌνμ κ°μ 체결λ κ³μ½μ μ€μν΄μΌ νλ€.
- κ³μ½μ μν μ€κ³μ λ°λ₯΄λ©΄ νλ ₯νλ ν΄λΌμ΄μΈνΈμ μνΌνμ μ μΈμ€ν΄μ€ μ¬μ΄μλ μ΄λ€ κ³μ½μ΄ λ§Ίμ΄μ Έ μλ€. ν΄λΌμ΄μΈνΈμ μνΌνμ μ μ΄ κ³μ½μ μ€μν λλ§ μ μμ μΌλ‘ νλ ₯νλ€. ν΄λΌμ΄μΈνΈ μ μ₯μμ μλΈνμ μ μνΌνμ μ ν μ’ λ₯μ¬μΌ νλ κ²μ΄λ€.
μμ μλ΅.
π μλΈνμ κ³Ό κ³μ½β
- κ³μ½μ κ΄μ μμ μμμ΄ μ΄λνλ κ°μ₯ ν° λ¬Έ μ λ μμ ν΄λμ€κ° λΆλͺ¨ ν΄λμ€μ λ©μλλ₯Ό μ€λ²λΌμ΄λ©ν μ μλ€λ κ²μ΄λ€.
- μλ₯Ό λ€μ΄μ
DiscountPolicy
λ₯Ό μμλ°λBrokenDiscountPolicy
ν΄λμ€λcalculateDiscountAmount
λ©μλλ₯Ό μ€λ²λΌμ΄λ©ν ν μ¬κΈ°μ μλ‘μ΄ μ¬μ 쑰건μ μΆκ°νλ€. μ΄ μλ‘μ΄ μ¬μ 쑰건μ μ’ λ£ μκ°μ΄ μμ μ λλ μνλ₯Ό μ맀ν μ μλ€λ κ²μ΄λ€. λ°λΌμDiscountPolicy
λ³΄λ€ λ κ°νλ μ¬μ 쑰건μ μ μνλ€.
public class BrokenDiscountPolicy extends DiscountPolicy {
public BrokenDiscountPolicy(DiscountCondition ... conditions) {
super(conditions);
}
@Override
public Money calculateDiscountAmount(Screening screening) {
checkPrecondition(screening); // κΈ°μ‘΄μ μ¬μ 쑰건
checkStrongPrecondition(screening); // λ κ°λ ₯ν μ¬μ 쑰건
Money amount = screening.getMovieFee();;
checkPostcondition(amount); // κΈ°μ‘΄μ μ¬ν쑰건
return amount;
}
// ...
}
BrokenDiscountPolicy
ν΄λμ€κ°DiscountPolicy
ν΄λμ€μ μμ ν΄λμ€μ΄κΈ° λλ¬Έμ μ»΄νμΌλ¬ λ μλ¬΄λ° μ μ½ μμ΄ μ μΊμ€ν μ νμ©νλ€. λ¬Έμ λMovie
λ μ€μ§DiscountPolicy
μ μ¬μ μ‘°κ±΄λ§ μκ³ μλ€λ μ μ΄λ€. κ·Έλ κΈ° λλ¬ΈμBrokenDiscountPolicy
μ μΆκ°ν μ¬μ 쑰건μ μ΄λ₯Ό νμ©νμ§ μκΈ° λλ¬Έμ νλ ₯μ μ€ν¨νκ³ λ§λ€. λ€μλ§ν΄μ ν΄λΌμ΄μΈνΈ κ΄μ μμDiscountPolicy
λ₯Ό λ체ν μ μκΈ° λλ¬Έμ μλΈνμ μ΄ μλλ€.- λ°λΌμ μμ ν΄λμ€κ° λΆλͺ¨ ν΄λμ€μ μλΈνμ μ΄ λκΈ° μν΄μλ λ€μ 쑰건μ λ§μ‘±μμΌμΌ νλ€.
π μλΈνμ μ λ κ°λ ₯ν μ¬μ 쑰건μ μ μν μ μλ€.
- κ·Έ λ°λλ‘ μ¬μ 쑰건μ μ κ±°ν΄μ μ½νμν¨λ€λ©΄ μ΄λ»κ² λ κΉ?
public class BrokenDiscountPolicy extends DiscountPolicy {
// ...
@Override
public Money calculateDiscountAmount(Screening screening) {
// checkPrecondition(screening); // κΈ°μ‘΄μ μ¬μ 쑰건 μ κ±°
Money amount = screening.getMovieFee();;
checkPostcondition(amount); // κΈ°μ‘΄μ μ¬ν쑰건
return amount;
}
// ...
}
BrokenDiscountPolicy
λScreening
μ λν μ¬μ 쑰건μ 체ν¬νμ§ μμμ§λ§Movie
λDiscountPolicy