μ΄λ€ κ°μ²΄κ° νλ ₯νκΈ° μν΄ λ€λ₯Έ κ°μ²΄λ₯Ό νμλ‘ ν λ λ κ°μ²΄ μ¬μ΄μ μμ‘΄μ±μ΄ μ‘΄μ¬νκ² λλ€. μμ‘΄μ±μ μ€ν μμ κ³Ό ꡬν μμ μ μλ‘ λ€λ₯Έ μλ―Έλ₯Ό κ°μ§λ€.
μμ‘΄μ±μ μ μ΄λ μ μκΈ° λλ¬Έμ μμ‘΄μ±μ μ’ λ₯λ₯Ό μ§μ μμ‘΄μ±κ³Ό κ°μ μμ‘΄μ±μΌλ‘ λλκΈ°λ νλ€.
// μ§μ μμ‘΄μ±
Class Movie {
private AmountDiscountPolicy amountDiscountPolicy
= new AmountDiscountPolicy();
...
}
// κ°μ μμ‘΄μ±
class Movie {
private DiscountPolicy discountPolicy;
Movie(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
...
}
ν΄λμ€λ μμ κ³Ό νλ ₯ν κ°μ²΄μ ꡬ체μ μΈ ν΄λμ€μ λν΄ μμμλ μλλ€. ꡬ체μ μΈ ν΄λμ€λ₯Ό μλ©΄ μμλ‘ κ·Έ ν΄λμ€κ° μ¬μ©λλ νΉμ ν λ¬Έλ§₯μ κ°νκ² κ²°ν©λκΈ° λλ¬Έμ΄λ€.
컨ν
μ€νΈ λ
립μ±
ν΄λμ€κ° μ¬μ©λ νΉμ ν λ¬Έλ§₯μ λν΄ μ΅μνμ κ°μ λ§μΌλ‘ μ΄λ€μ Έ μλ€λ©΄ λ€λ₯Έ λ¬Έλ§₯μμ μ¬μ¬μ©νκΈ°κ° λ μμν΄μ§λ€.
μμ€ν μ ꡬμ±νλ κ°μ²΄κ° 컨ν μ€νΈ λ 립μ μ΄λΌλ©΄ ν΄λΉ μμ€ν μ λ³κ²½νκΈ° μ½λ€.
μ¬κΈ°μ 컨ν μ€νΈ λ 립μ μ΄λΌλ λ§μ κ° κ°μ²΄κ° ν΄λΉ κ°μ²΄λ₯Ό μ€ννλ μμ€ν μ κ΄ν΄ μ무κ²λ μμ§ λͺ»νλ€λ μλ―Έμ΄λ€.
μ€κ³λ₯Ό μ μ°νκ³ μ¬μ¬μ© κ°λ₯νκ² λ§λ€κΈ°λ‘ κ²°μ νλ€λ©΄ μμ‘΄μ±μ κ΄λ¦¬νλ λ° μ μ©ν λͺ κ°μ§ μμΉκ³Ό κΈ°λ²μ μ΅ν νμκ° μλ€.
κ°μ²΄μ§ν₯ ν¨λ¬λ€μμ κ·Όκ°μ νλ ₯μ΄λ€. κ°μ²΄λ€μ νλ ₯μ ν΅ν΄ μ ν리μΌμ΄μ
μ μλͺ
λ ₯μ λΆμ΄λ£λλ€.
κ°μ²΄λ€μ΄ νλ ₯νκΈ° μν΄μλ μλ‘μ μ‘΄μ¬μ μν κ°λ₯ν μ±
μμ μμμΌ νλ€. μ΄λ° μ§μλ€μ΄ κ°μ²΄ μ¬μ΄μ μμ‘΄μ±μ λ³λλ€. λ°λΌμ λͺ¨λ μμ‘΄μ±μ΄ λμ κ²μ μλλ€. μμ‘΄μ±μ κ°μ²΄λ€μ νλ ₯μ κ°λ₯νκ² λ§λλ λ§€κ°μ²΄λΌλ κ΄μ μμλ λ°λμ§ν κ²μ΄λ€. νμ§λ§ μμ‘΄μ±μ΄ κ³Όνλ©΄ λ¬Έμ κ° λ μ μλ€.
λ°λμ§ν μμ‘΄μ±μ΄λ 무μμΌκΉ?
λ°λμ§ν μμ‘΄μ±μ μ¬μ¬μ©κ³Ό κ΄λ ¨μ΄ μλ€.
λ°λμ§ν μμ‘΄μ±κ³Ό λ°λμ§νμ§ λͺ»ν μμ‘΄μ±μ κ°λ¦¬ν€λ μ’ λ μΈλ ¨λ μ©μ΄κ° μ‘΄μ¬νλ€. κ·Έκ²μ΄ λ°λ‘ κ²°ν©λμ΄λ€.
μ΄λ€ λ μμ μ¬μ΄μ μ‘΄μ¬νλ μμ‘΄μ±μ΄ λ°λμ§ν λ λ μμκ° λμ¨ν κ²°ν©λ(loose coupling) λλ μ½ν κ²°ν©λ(weak coupling)λ₯Ό κ°μ§λ€κ³ λ§νλ€.
λ°λλ‘ λ μμ μ¬μ΄μ μμ‘΄μ±μ΄ λ°λμ§νμ§ λͺ»ν λ λ¨λ¨ν κ²°ν©λ(tight coupling) λλ κ°ν κ²°ν©λ(strong coupling)λ₯Ό κ°μ§λ€κ³ λ§νλ€.
μμ‘΄μ±κ³Ό κ²°ν©λ
μΌλ°μ μΌλ‘ μμ‘΄μ±κ³Ό κ²°ν©λλ₯Ό λμμ΄λ‘ μ¬μ©νμ§λ§ μ¬μ€ λ μ©μ΄λ μλ‘ λ€λ₯Έ κ΄μ μμ κ΄κ³μ νΉμ±μ μ€λͺ νλ μ©μ΄λ€.
μλ‘μ λν΄ μκ³ μλ μ§μμ μμ΄ κ²°ν©λλ₯Ό κ²°μ νλ€.
κ²°ν©λμ μ λλ ν μμκ° μμ μ΄ μμ‘΄νκ³ μλ λ€λ₯Έ μμμ λν΄ μκ³ μλ μ 보μ μμΌλ‘ κ²°μ λλ€. ν μμκ° λ€λ₯Έ μμμ λν΄ λ λ§μ μ 보λ₯Ό μκ³ μμμλ‘ λ μμλ κ°νκ² κ²°ν©λλ€.
κ²°ν©λλ₯Ό λμ¨νκ² λ§λ€κΈ° μν΄μλ νλ ₯νλ λμμ λν΄ νμν μ 보 μΈμλ μ΅λν κ°μΆλ κ²μ΄ μ€μνλ€. κ·Έκ²μ΄ λ°λ‘ μΆμνλ€.
μΆμνλ μ΄λ€ μμ, μΈλΆμ¬ν, ꡬ쑰λ₯Ό μ’ λ λͺ ννκ² μ΄ν΄νκΈ° μν΄ νΉμ μ μ°¨λ 물체λ₯Ό μλμ μΌλ‘ μλ΅νκ±°λ κ°μΆ€μΌλ‘μ¨ λ³΅μ‘λλ₯Ό 극볡νλ λ°©λ²μ΄λ€.
μΌλ°μ μΌλ‘ μΆμνμ κ²°ν©λμ κ΄μ μμ μμ‘΄ λμμ λ€μκ³Ό κ°μ΄ ꡬλΆνλ κ²μ΄ μ μ©νλ€. λͺ©λ‘μμ μλμͺ½μΌλ‘ κ°μλ‘ ν΄λΌμ΄μΈνΈκ° μμμΌ νλ μ§μμ μμ΄ μ μ΄μ§κΈ° λλ¬Έμ κ²°ν©λκ° λμ¨ν΄μ§λ€.
κ²°ν©λ μΈ‘λ©΄μμ newκ° ν΄λ‘μ΄ μ΄μ 2κ°μ§
ꡬ체 ν΄λμ€μ μ§μ μμ‘΄νλ©΄ κ²°ν©λκ° λμμ§λ€λ μ¬μ€μ κΈ°μ΅νμ. κ²°ν©λμ κ΄μ μμ ꡬ체 ν΄λμ€λ νλ ₯μμκ² λ무 λ§μ μ§μμ μλλ‘ κ°μνλ€. μ¬κΈ°μ newλ λ¬Έμ λ₯Ό λ ν¬κ² λ§λ λ€.
ν΄λΌμ΄μΈνΈλ ꡬ체 ν΄λμ€λ₯Ό μμ±νλ λ° μ΄λ€ μ λ³΄κ° νμνμ§μ λν΄μλ μμμΌ νκΈ° λλ¬Έμ΄λ€.
μΆμ²
μ€λΈμ νΈ - μ½λλ‘ μ΄ν΄νλ κ°μ²΄μ§ν₯ μ€κ³
https://github.com/eternity-oop/object