π‘ λΈλ¦¬μ§ ν¨ν΄μ΄λ?
ν° ν΄λμ€ λλ λ°μ νκ² κ΄λ ¨λ ν΄λμ€λ€μ μ§ν©μ λ κ°μ κ°λ³ κ³μΈ΅κ΅¬μ‘°(μΆμν λ° κ΅¬ν)λ‘ λλ ν κ°κ° λ 립μ μΌλ‘ κ°λ°ν μ μλλ‘ νλ ꡬ쑰 λμμΈ ν¨ν΄μ λλ€.
π‘ λ¬Έμ ?
Circle(μ) λ° Square(μ§μ¬κ°ν)λΌλ ν μμ μμ ν΄λμ€λ€μ΄ μλ κΈ°ννμ Shape(λͺ¨μ) ν΄λμ€κ° μλ€κ³ κ°μ ν΄ λ΄ μλ€. μ΄ ν΄λμ€ κ³μΈ΅ ꡬ쑰λ₯Ό νμ₯νμ¬ μμμ λμ νκΈ° μν΄ Red(λΉ¨κ°μ) λ° Blue(νλμ) λͺ¨μλ€μ μμ ν΄λμ€λ€μ λ§λ€ κ³νμ λλ€. κ·Έλ¬λ μ΄λ―Έ λ κ°μ μμ ν΄λμ€κ° μμΌλ―λ‘ BlueCircle(νλμ μ) λ° RedSquare(λΉ¨κ°μ μ§μ¬κ°ν)μ κ°μ λ€ κ°μ§μ ν΄λμ€ μ‘°ν©μ λ§λ€μ΄μΌ ν©λλ€.
μλ‘μ΄ λͺ¨μ μ νλ€κ³Ό μμ μ νλ€μ μΆκ°ν λλ§λ€ κ³μΈ΅ ꡬ쑰λ κΈ°νκΈμμ μΌλ‘ μ±μ₯ν©λλ€.
μλ₯Ό λ€μ΄, μΌκ°ν λͺ¨μμ μΆκ°νλ €λ©΄ κ° μμλ³λ‘ νλμ© λ κ°μ μμ ν΄λμ€λ€μ λμ ν΄μΌ ν©λλ€. κ·Έλ¦¬κ³ κ·Έ νμ λ μ μμμ μΆκ°νλ €λ©΄ κ° λͺ¨μ μ νλ³λ‘ νλμ© μΈ κ°μ μμ ν΄λμ€λ₯Ό λ§λ€μ΄μΌ ν©λλ€. μ νλ€μ΄ λ§μμ§λ©΄ λ§μμ§μλ‘ μ½λλ μ μ 볡μ‘ν΄μ§λλ€.
π‘ κ·Έλμ λΈλ¦¬μ§ ν¨ν΄μ μλλ€.
λΈλ¦¬μ§ ν¨ν΄μ μμμμ κ°μ²΄ ν©μ±μΌλ‘ μ ννμ¬ μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ €κ³ μλν©λλ€. μ΄κ²μ΄ μλ―Ένλ λ°λ μ°¨μ μ€ νλλ₯Ό λ³λμ ν΄λμ€ κ³μΈ΅κ΅¬μ‘°λ‘ μΆμΆνμ¬ μλ ν΄λμ€λ€μ΄ ν ν΄λμ€ λ΄μμ λͺ¨λ μνμ νλλ€μ κ°λ λμ μ κ³μΈ΅κ΅¬μ‘°μ κ°μ²΄λ₯Ό μ°Έμ‘°νλλ‘ νλ€λ κ²μ λλ€.
μ΄ μ κ·Ό λ°©μμ λ°λ₯΄λ©΄, μμ κ΄λ ¨ μ½λλ₯Ό Red λ° BlueλΌλ λ κ°μ μμ ν΄λμ€λ€μ΄ μλ μ체 ν΄λμ€λ‘ μΆμΆν μ μμ΅λλ€. κ·Έλ° λ€μ Shape ν΄λμ€λ μμ κ°μ²΄λ€ μ€ νλλ₯Ό κ°λ¦¬ν€λ μ°Έμ‘° νλλ₯Ό λ°μ΅λλ€. μ΄μ λͺ¨μμ μ°κ²°λ μμ κ°μ²΄μ λͺ¨λ μμ κ΄λ ¨ μμ μ μμν μ μμ΅λλ€. μ΄ μ°Έμ‘°λ Shape λ° Color ν΄λμ€λ€ μ¬μ΄μ λΈλ¦¬μ§(λ€λ¦¬) μν μ ν κ²μ λλ€. μ΄μ λΆν° μ μμλ€μ μΆκ°ν λ λͺ¨μ κ³μΈ΅κ΅¬μ‘°λ₯Ό λ³κ²½ν νμκ° μμΌλ©° κ·Έ λ°λμ κ²½μ°λ λ§μ°¬κ°μ§μ λλ€.
π‘ ν΄λμ€ λ€μ΄μ΄κ·Έλ¨μΌλ‘ λ³Έ λΈλ¦¬μ§ ν¨ν΄
- μΆμν : κΈ°λ₯ κ³μΈ΅μ μ΅μμ ν΄λμ€. ꡬν κ°μ²΄μ μμ‘΄νμ¬ κ΅¬ν λΆλΆμ λ©μλλ₯Ό νΈμΆν©λλ€.
- ꡬν : κΈ°λ₯ ꡬνμ μΈν°νμ΄μ€.
- ꡬ체μ μΈ κ΅¬ν(Concrete Implementations) : νλ«νΌλ³ λ§μΆ€ν κΈ°λ₯ ꡬν
- μ μ λ μΆμν(Refined Abstraction) : κΈ°λ₯ κ³μΈ΅μμ μλ‘μ΄ λΆλΆμ νμ₯ν ν΄λμ€. λΆλͺ¨ ν΄λμ€μ λ§μ°¬κ°μ§λ‘ ꡬν κ°μ²΄μ μμ‘΄νμ¬ κ΅¬ν λΆλΆμ λ©μλλ₯Ό νΈμΆν©λλ€.
- ν΄λΌμ΄μΈνΈ : μΆμν κ°μ²΄μ μμ‘΄
π‘ λΈλ¦¬μ§ ν¨ν΄ ꡬν
// 'μΆμν'λ λ ν΄λμ€ κ³μΈ΅κ΅¬μ‘°μ 'μ μ΄' λΆλΆμ λν μΈν°νμ΄μ€λ₯Ό μ μνλ©°,
// μ΄κ²μ 'ꡬν' κ³μΈ΅κ΅¬μ‘°μ κ°μ²΄μ λν μ°Έμ‘°λ₯Ό μ μ§νκ³ λͺ¨λ μ€μ μμ
μ μ΄
// κ°μ²΄μ μμν©λλ€.
class RemoteControl is
protected field device: Device
constructor RemoteControl(device: Device) is
this.device = device
method togglePower() is
if (device.isEnabled()) then
device.disable()
else
device.enable()
method volumeDown() is
device.setVolume(device.getVolume() - 10)
method volumeUp() is
device.setVolume(device.getVolume() + 10)
method channelDown() is
device.setChannel(device.getChannel() - 1)
method channelUp() is
device.setChannel(device.getChannel() + 1)
// μ΄μ μΆμν κ³μΈ΅κ΅¬μ‘°λ‘λΆν° ν΄λμ€λ€μ μ₯μΉ ν΄λμ€λ€κ³Ό λ
립μ μΌλ‘ νμ₯ν μ
// μμ΅λλ€.
class AdvancedRemoteControl extends RemoteControl is
method mute() is
device.setVolume(0)
// 'ꡬν' μΈν°νμ΄μ€λ λͺ¨λ ꡬμ ꡬν ν΄λμ€λ€μ 곡ν΅μ μΈ λ©μλλ₯Ό μ μΈνλ©°, μ΄λ
// μΆμνμ μΈν°νμ΄μ€μ μΌμΉν νμκ° μμ΅λλ€. μ€μ λ‘ λ μΈν°νμ΄μ€λ μμ ν λ€λ₯Ό
// μ μμ΅λλ€. μΌλ°μ μΌλ‘ ꡬν μΈν°νμ΄μ€λ μμ(primitive) μμ
λ€λ§ μ 곡νλ
// λ°λ©΄ μΆμνλ μ΄λ¬ν μμ μμ
λ€μ κΈ°λ°μΌλ‘ λ μμ μμ€μ μμ
λ€μ μ μν©λλ€.
interface Device is
method isEnabled()
method enable()
method disable()
method getVolume()
method setVolume(percent)
method getChannel()
method setChannel(channel)
// λͺ¨λ μ₯μΉλ κ°μ μΈν°νμ΄μ€λ₯Ό λ°λ¦
λλ€.
class Tv implements Device is
// …
class Radio implements Device is
// …
// ν΄λΌμ΄μΈνΈ μ½λ μ΄λκ°μ…
tv = new Tv()
remote = new RemoteControl(tv)
remote.togglePower()
radio = new Radio()
remote = new AdvancedRemoteControl(radio)
π‘ λ§λ¬΄λ¦¬
λΈλ¦¬μ§ ν¨ν΄μ
- λͺ¨λ리μ ν΄λμ€λ₯Ό μ¬λ¬ ν΄λμ€ κ³μΈ΅κ΅¬μ‘°λ‘ λλμ΄ λ³νμ μννκ³ μ ν λ
- λ°νμμ ꡬνμ μ νν΄μΌ ν λ
μ μ¬μ©ν μ μμ΅λλ€.
νλ«νΌ λ 립μ μΈ ν΄λμ€λ€κ³Ό μ±λ€μ λ§λ€ μ μκ³ , ν΄λΌμ΄μΈνΈ μ½λλ μμ μμ€μ μΆμνλ₯Ό ν΅ν΄ μλνλ©°, νλ«νΌ μΈλΆ μ 보μ λ ΈμΆλμ§ μμ OCPμ SRPλ₯Ό λ§μ‘±ν©λλ€. κ·Έλ¬λ, κ²°ν©λκ° λμ ν΄λμ€μ ν¨ν΄μ μ μ©νλ©΄ μ½λλ₯Ό λ 볡μ‘νκ² λ§λ€ μ μμ΅λλ€.