
μμμ 첫 λ²μ§Έ μ©λλ νμ κ³μΈ΅μ ꡬννλ κ²μ΄λ€. νμ κ³μΈ΅μ κ΄μ μμ λΆλͺ¨ ν΄λμ€λ μμ ν΄λμ€μ μΌλ°ν(generalization)μ΄κ³ μμ ν΄λμ€λ λΆλͺ¨ ν΄λμ€μ νΉμν(specialization)λ€.
μμμ λ λ²μ§Έ μ©λλ μ½λ μ¬μ¬μ©μ΄λ€. νμ§λ§ μ¬μ¬μ©μ μν΄ μμμ μ¬μ©ν κ²½μ° λΆλͺ¨ ν΄λμ€μ μμ ν΄λμ€κ° κ°νκ² κ²°ν©λκΈ° λλ¬Έμ λ³κ²½νκΈ° μ΄λ €μ΄ μ½λλ₯Ό μ»κ² λ νλ₯ μ΄ λλ€.
μμμ μ¬μ©νλ μΌμ°¨μ μΈ λͺ©νλ μ½λ μ¬μ¬μ©μ΄ μλλΌ νμ
κ³μΈ΅μ ꡬννλ κ²μ΄μ΄μΌ νλ€. λ°λ©΄ νμ
κ³μΈ΅μ λͺ©νλ‘ μμμ μ¬μ©νλ©΄ λ€νμ μΌλ‘ λμνλ κ°μ²΄λ€μ κ΄κ³μ κΈ°λ°ν΄ νμ₯ κ°λ₯νκ³ μ μ°ν μ€κ³λ₯Ό μ»μ μ μκ² λλ€.
κ·Έλ λ€λ©΄ νμ κ³μΈ΅μ΄λ 무μμΈκ°? μμμ μ΄μ©ν΄ νμ κ³μΈ΅μ ꡬννλ€λ κ²μ΄ 무μμ μλ―Ένλκ°?
κ°μ²΄μ§ν₯ ν¨λ¬λ€μ κ΄μ μ νμ
νμ
μ λ€μκ³Ό κ°μ λκ°μ§ κ΄μ μμ μ μν μ μλ€.
κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μμ μ€νΌλ μ΄μ μ κ°μ²΄κ° μμ ν μ μλ λ©μμ§λ₯Ό μλ―Ένλ€. λ°λΌμ κ°μ²΄μ νμ μ΄λ κ°μ²΄κ° μμ ν μ μλ λ©μμ§μ μ’ λ₯λ₯Ό μ μνλ κ²μ΄λ€.
κ°μ²΄κ° μμ ν μ μλ λ©μμ§λ₯Ό κΈ°μ€μΌλ‘ νμ μ λΆλ₯νκΈ° λλ¬Έμ λμΌν νΌλΈλ¦ μΈν°νμ΄μ€λ₯Ό κ°μ§λ κ°μ²΄λ€μ λμΌν νμ μΌλ‘ λΆλ₯ν μ μλ€.
κ·Έλ λ€λ©΄ μ΄λ€ 쑰건μ λ§μ‘±μμΌμΌλ§ νμ κ³μΈ΅μ μν΄ μ¬λ°λ₯΄κ² μμμ μ¬μ©νλ€κ³ λ§ν μ μμκΉ?
μμ κ΄κ³κ° is-a κ΄κ³λ₯Ό λͺ¨λΈλ§νλκ°?
μΌλ°μ μΌλ‘ "[μμ ν΄λμ€]λ [λΆλͺ¨ ν΄λμ€]λ€"λΌκ³ λ§ν΄λ μ΄μνμ§ μλ€λ©΄ μμμ μ¬μ©ν νλ³΄λ‘ κ°μ£Όν μ μλ€.
ν΄λΌμ΄μΈνΈ μ
μ₯μμ λΆλͺ¨ ν΄λμ€μ νμ
μΌλ‘ μμ ν΄λμ€λ₯Ό μ¬μ©ν΄λ 무방νκ°?
μμ κ³μΈ΅μ μ¬μ©νλ ν΄λΌμ΄μΈνΈμ μ
μ₯μμ λΆλͺ¨ ν΄λμ€μ μμ ν΄λμ€μ μ°¨μ΄μ μ λͺ°λΌμΌ νλ€. μ΄λ₯Ό μμ ν΄λμ€μ λΆλͺ¨ ν΄λμ€ μ¬μ΄μ νλ νΈνμ±μ΄λΌκ³ λΆλ₯Έλ€.
νλμ΄ νΈνλλ€λ κ²μ λ¬΄μ¨ μλ―ΈμΌκΉ? λ¨μν λμΌν λ©μλλ₯Ό ꡬννκ³ μμΌλ©΄ νλμ΄ νΈνλλ κ²μΌκΉ?
μ¬κΈ°μ μ€μν κ²μ νλμ νΈν μ¬λΆλ₯Ό νλ¨νλ κΈ°μ€μ ν΄λΌμ΄μΈνΈμ κ΄μ μ΄λΌλ κ²μ΄λ€.
public void flyBird(Bird bird) {
// μΈμλ‘ μ λ¬λ λͺ¨λ birdλ λ μ μμ΄μΌ νλ€.
bird.fly();
}
νμ§λ§ Bird ν΄λμ€λ₯Ό μμ λ°μ Penguin ν΄λμ€κ° μλ€κ³ μκ°ν΄λ³΄μ. νκ·μ μ μ΄μ§λ§ λ μλ μλ€. μ΄λ μλͺ»λ μλͺ»λ μμμΌλ‘ μΈν νλ νΈνμ±μ μ€λ₯κ° λ°μνλ λνμ μΈ μ¬λ‘μ΄λ€.
ν΄λΌμ΄μΈνΈμ κΈ°λμ λ°λΌ κ³μΈ΅ λΆλ¦¬νκΈ°
λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ λ°©λ²μ ν΄λΌμ΄μΈνΈμ κΈ°λμ λ§κ² μμ κ³μΈ΅μ λΆλ¦¬νλ κ²λΏμ΄λ€. λ°λΌμ λ μ μλ μμ λ μ μλ μλ₯Ό λͺ
ννκ² κ΅¬λΆν μ μκ² μμ κ³μΈ΅μ λΆλ¦¬νλ©΄ μλ‘ λ€λ₯Έ μꡬμ¬νμ κ°μ§ ν΄λΌμ΄μΈνΈλ₯Ό λ§μ‘±μν¬ μ μμ κ²μ΄λ€.
public class Bird {
...
}
public class FlyingBird extends Bird {
public void fly() { ... }
...
}
public class Penguin extends Bird {
...
}
μ΄μ flyBird λ©μλλ FlyingBird νμ
μ μ΄μ©ν΄ λ μ μλ μλ§ μΈμλ‘ μ λ¬ λ κ²μ΄λ€.
```java
public void flyBird(FlyingBird bird) {
bird.fly();
}

νλμ ν΄λΌμ΄μΈνΈκ° μ€μ§ fly λ©μμ§λ§ μ μ‘νκΈ°λ₯Ό μνλ€λ©΄ μ΄ ν΄λΌμ΄μΈνΈμκ²λ fly λ©μμ§λ§ 보μ¬μΌ νλ€. λ€λ₯Έ ν΄λΌμ΄μΈνΈκ° μ€μ§ walk λ©μμ§λ§ μ μ‘νκΈ°λ₯Ό μνλ€λ©΄ μ΄ ν΄λΌμ΄μΈνΈμκ²λ walk λ©μμ§λ§ 보μ¬μΌ νλ€.

ν΄λΌμ΄μΈνΈμ λ°λΌ μΈν°νμ΄μ€λ₯Ό λΆλ¦¬νλ©΄ κ° ν΄λΌμ΄μΈνΈμ μκ΅¬κ° λ°λλλΌλ μν₯μ νκΈ ν¨κ³Όλ₯Ό ν¨κ³Όμ μΌλ‘ μ μ΄ν μ μκ² λλ€. μ΄μ²λΌ μΈν°νμ΄μ€λ₯Ό ν΄λΌμ΄μΈνΈμ κΈ°λμ λ°λΌ λΆλ¦¬ν¨μΌλ‘μ¨ λ³κ²½μ μν΄ μν₯μ μ μ΄νλ μ€κ³ μμΉμ μΈν°νμ΄μ€ λΆλ¦¬ μμΉ(Integerface Segrefation Principle, ISP)μ΄λΌκ³ λΆλ₯Έλ€.
κ·Έλμ μΈμ μμμ μ¬μ©ν΄μΌ νλκ°?
νλ νΈνμ±μ λ§μ‘±νλ μμ κ΄κ³λ λΆλͺ¨ ν΄λμ€λ₯Ό μλ‘μ΄ μμ ν΄λμ€λ‘ λ체 νλλΌλ μμ€ν
μ΄ λ¬Έμ μμ΄ λμν κ²μ΄λΌλ κ²μ 보μ₯ν΄μΌ νλ€. λ€μ λ§ν΄μ μμ ν΄λμ€μ λΆλͺ¨ ν΄λμ€ μ¬μ΄μ νλ νΈνμ±μ λΆλͺ¨ ν΄λμ€μ λν μμ ν΄λμ€μ λ체 κ°λ₯μ±μ ν¬ν¨νλ€.
νλ νΈνμ±κ³Ό λ체 κ°λ₯μ±μ μ¬λ°λ₯Έ μμ κ΄κ³λ₯Ό ꡬμΆνκΈ° μν΄ λ°λΌμΌ ν μ§μΉ¨μ΄λΌκ³ ν μ μλ€.
리μ€μ½ν μΉμ μμΉμ
ν΄λΌμ΄μΈνΈμ μλ² μ¬μ΄μ νλ ₯μ μ무(obligation)μ μ΄μ΅(benefit)μΌλ‘ ꡬμ±λ κ³μ½μ κ΄μ μμ νννλ κ²μ κ³μ½μ μν μ€κ³λΌκ³ λΆλ₯Έλ€. κ³μ½μ μν μ€κ³λ ν΄λΌμ΄μΈνΈκ° μ μμ μΌλ‘ λ©μλλ₯Ό μ€ννκΈ° μν΄ λ§μ‘±μμΌμΌ νλ μ¬μ 쑰건(precondition)κ³Ό λ©μλκ° μ€νλ νμ μλ²κ° ν΄λΌμ΄μΈνΈμκ² λ³΄μ₯ν΄μΌ νλ μ¬ν 쑰건(postcondirion)κ³Ό λ©μλ μ€ν μ κ³Ό μ€ννμ μΈμ€ν΄μ€κ° λ§μ‘±μμΌμΌ νλ ν΄λμ€ λΆλ³μ(class invariant)μ μΈ κ°μ§ μμλ‘ κ΅¬μ±λλ€.
μ΄λ€ νμ μ΄ μνΌ νμ μμ μ μν μ¬μ μ‘°κ±΄λ³΄λ€ λ μ½ν μ¬μ 쑰건μ μ μνκ³ μλ€λ©΄ κ·Έ νμ μ μλΈ νμ μ΄ λ μ μμ§λ§ λ κ°ν μ¬μ 쑰건μ μ μνλ€λ©΄ μλΈ νμ μ΄ λ μ μλ€. μ΄λ€ νμ μ΄ μνΌ νμ μμ μ μν μ¬ν μ‘°κ±΄λ³΄λ€ λ κ°ν μ¬ν 쑰건μ μ μ νλλΌλ κ·Έ νμ μ μ¬μ ν μλΈ νμ μ΄μ§λ§ λ μ½ν μ¬ν 쑰건μ μ μνλ€λ©΄ μλΈ νμ μ μ‘°κ±΄μ΄ κΉ¨μ§κ³ λ§ κ²μ΄λ€.
μΆμ²
μ€λΈμ νΈ - μ½λλ‘ μ΄ν΄νλ κ°μ²΄μ§ν₯ μ€κ³
https://github.com/eternity-oop/object