π‘ μ΄λν° ν¨ν΄μ΄λ?
νΈνλμ§ μλ μΈν°νμ΄μ€λ₯Ό κ°μ§ κ°μ²΄λ€μ΄ νμ ν μ μλλ‘ νλ ꡬ쑰μ λμμΈ ν¨ν΄μ λλ€.
π λ¬Έμ μν©
μ£Όμ μμ₯ λͺ¨λν°λ§ μ±μ λ§λ€κ³ μκ³ , μ΄ μ±μ μ¬λ¬ μμ€μμ μ£Όμ λ°μ΄ν°λ₯Ό XML νμμΌλ‘ λ€μ΄λ‘λν ν μ¬μ©μμκ² λ³΄κΈ° μ’μ μ°¨νΈλ€κ³Ό λ€μ΄μ΄κ·Έλ¨λ€μ νμνλ€κ³ μμν΄ λ΄ μλ€.
μ΄λ μμ μ λΉμ μ νμ¬μ μ€λ§νΈ λΆμ λΌμ΄λΈλ¬λ¦¬λ₯Ό ν΅ν©νμ¬ λΉμ μ μ±μ κ°μ νκΈ°λ‘ κ²°μ νμ΅λλ€. κ·Έλ°λ° μ΄ λΆμ λΌμ΄λΈλ¬λ¦¬λ JSON νμμ λ°μ΄ν°λ‘λ§ μλν©λλ€. μ¦, μ±κ³Ό λΌμ΄λΈλ¬λ¦¬κ° νΈνλμ§ μλ μν©μ λλ€.
μ΄ λΌμ΄λΈλ¬λ¦¬λ₯Ό XMLκ³Ό μλνλλ‘ λ³κ²½ν μ μμΌλ, κ·Έλ¬λ©΄ λΌμ΄λΈλ¬λ¦¬μ μμ‘΄νλ μΌλΆ κΈ°μ‘΄ μ½λκ° μμλ μ μμ΅λλ€. λ μ²μλΆν° νμ¬μ λΌμ΄λΈλ¬λ¦¬ μμ€ μ½λμ μ κ·Όνλ κ²μ΄ λΆκ°λ₯νμ¬ μμ ν΄κ²° λ°©μμ μ¬μ©νμ§ λͺ»ν μλ μμ΅λλ€.
π κ·Έλμ, μ΄λν° ν¨ν΄μ μλλ€.
μ΄ κ²½μ°μ μ°μ΄λ ν¨ν΄μ΄ ‘μ΄λν° ν¨ν΄’μ λλ€. μ΄λν°λ ν κ°μ²΄μ μΈν°νμ΄μ€λ₯Ό λ€λ₯Έ κ°μ²΄κ° μ΄ν΄ν μ μλλ‘ λ³ννλ νΉλ³ν κ°μ²΄μ λλ€.
μ΄λν°λ λ³νμ 볡μ‘μ±μ μ¨κΈ°κΈ° μνμ¬ κ°μ²΄ μ€ νλλ₯Ό λν(ν¬μ₯)ν©λλ€. λνλ κ°μ²΄λ μ΄λν°λ₯Ό μΈμνμ§λ λͺ»ν©λλ€. μλ₯Ό λ€μ΄ λ―Έν° λ° ν¬λ‘λ―Έν° λ¨μλ‘ μλνλ κ°μ²΄λ₯Ό λͺ¨λ λ°μ΄ν°λ₯Ό νΌνΈ λ° λ§μΌκ³Ό κ°μ μκ΅μ λ¨μλ‘ λ³ννλ μ΄λν°λ‘ λνν μ μμ΅λλ€.
μ΄λν°λ λ°μ΄ν°λ₯Ό λ€μν νμμΌλ‘ λ³νν μ μμ λΏλ§ μλλΌ λ€λ₯Έ μΈν°νμ΄μ€λ₯Ό κ°μ§ κ°μ²΄λ€μ΄ νμ νλ λ°μλ λμμ μ€ μ μμ΅λλ€.
π μ΄λν°λ μ΄λ»κ² μλνλλ°?
- μ΄λν°λ κΈ°μ‘΄μ μλ κ°μ²΄ μ€ νλμ νΈνλλ μΈν°νμ΄μ€λ₯Ό λ°μ΅λλ€.
- μ΄ μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ©΄ κΈ°μ‘΄ κ°μ²΄λ μ΄λν°μ λ©μλλ€μ μμ νκ² νΈμΆν μ μμ΅λλ€.
- νΈμΆμ μμ νλ©΄ μ΄λν°λ μ΄ μμ²μ λ λ²μ§Έ κ°μ²΄μ ν΄λΉ κ°μ²΄κ° μμνλ νμκ³Ό μμλλ‘ μ λ¬ν©λλ€.
λλ‘λ μλ°©ν₯μΌλ‘ νΈμΆμ λ³νν μ μλ μλ°©ν₯ μ΄λν°λ₯Ό λ§λλ κ²λ κ°λ₯ν©λλ€.
μμ κ·Έλ¦Όμ²λΌ νΈνλμ§ μλ κ²½μ°, XML → JSON λ³ν μ΄λν°λ₯Ό λ§λ€κ³ μ΄ μ΄λν°λ₯Ό ν΅ν΄μλ§ ν΄λΉ λΌμ΄λΈλ¬λ¦¬μ ν΅μ νλλ‘ μ½λλ₯Ό μ‘°μ ν©λλ€. μ΄λν°λ νΈμΆμ λ°μΌλ©΄ λ€μ΄μ€λ XML λ°μ΄ν°λ₯Ό JSON κ΅¬μ‘°λ‘ λ³νν ν ν΄λΉ νΈμΆμ λνλ λΆμ κ°μ²΄μ μ μ ν λ©μλλ€μ μ λ¬ν©λλ€.
π‘ ν΄λμ€ λ€μ΄μ΄κ·Έλ¨μΌλ‘ λ³Έ μ΄λν° ν¨ν΄
μ΄λν° ν¨ν΄μ ν΄λΌμ΄μΈνΈ, ν΄λΌμ΄μΈνΈ μΈν°νμ΄μ€, μλΉμ€, μ΄λν°λ‘ ꡬμ±λλ©° 1) ν©μ± 2) μμ λ λ°©λ²μΌλ‘ ꡬνν μ μμ΅λλ€.
π ν©μ±μ μ¬μ©ν μ΄λν° = κ°μ²΄ μ΄λν°(Object Adaptor)
- ν΄λΌμ΄μΈνΈλ νλ‘κ·Έλ¨μ κΈ°μ‘΄ λΉμ¦λμ€ λ‘μ§μ ν¬ν¨νλ ν΄λμ€μ λλ€. → μ½κ² λ§νλ©΄, κΈ°μ‘΄ μμ€ν μ μ΄λν°λ₯Ό ν΅ν΄ μ΄μ©νλ €λ λΆλΆμΌλ‘, Client Interfaceλ₯Ό ν΅ν΄ μλΉμ€λ₯Ό μ΄μ©ν©λλ€.
- ν΄λΌμ΄μΈνΈ μΈν°νμ΄μ€(νκ²)λ λ€λ₯Έ ν΄λμ€λ€μ΄ ν΄λΌμ΄μΈνΈ μ½λμ 곡λ μμ ν μ μλλ‘ λ°λΌμΌνλ νλ‘ν μ½μ λ»ν©λλ€. → μ½κ² λ§νλ©΄, Adapterκ° κ΅¬ννλ μΈν°νμ΄μ€λ₯Ό λ§ν©λλ€.
- μλΉμ€(Adaptee)λ μΌλ°μ μΌλ‘ νμ¬ λλ λ κ±°μμ μ μ©ν ν΄λμ€λ₯Ό λ»ν©λλ€. → μ½κ² λ§νλ©΄, Adapterμ λμ κ°μ²΄λ‘, ν΄λΌμ΄μΈνΈμ νΈνμ΄ μλμ§λ§ μ¬μ©νκ³ μΆμ κ°μ²΄λ₯Ό λ§ν©λλ€.
- μ΄λν°λ ν΄λΌμ΄μΈνΈμ μλΉμ€ μμͺ½μμ μλν μ μλ ν΄λμ€λ‘, μλΉμ€ κ°μ²΄λ₯Ό λννλ λμ ν΄λΌμ΄μΈνΈ μΈν°νμ΄μ€λ₯Ό ꡬνν©λλ€.
ν΄λΌμ΄μΈνΈ μ½λλ ν΄λΌμ΄μΈνΈ μΈν°νμ΄μ€λ₯Ό ν΅ν΄ μ΄λν°μ μλνλ ν μ΄λν° ν΄λμ€μ κ²°ν©νμ§ μμ΅λλ€. λλΆμ κΈ°μ‘΄ ν΄λΌμ΄μΈνΈ μ½λ μμ μμ΄ μλ‘μ΄ μ νμ μ΄λν°λ€μ νλ‘κ·Έλ¨μ λμ ν μ μμ΅λλ€. μ΄κ²μ μλΉμ€ ν΄λμ€μ μΈν°νμ΄μ€κ° λ³κ²½λκ±°λ κ΅μ²΄λ λ μ μ©ν μ μμ΅λλ€.
κ°μ²΄ μ΄λν°μ κ°μ₯ ν° νΉμ§μ ‘μμ’μ μ¬μ©νλ€λ κ²μ λλ€.
β μμ(Inheritance) VS ν©μ±(Composition) VS μμ(Delegation)
μμμ is a κ΄κ³λ‘ extends ν€μλλ₯Ό ν΅ν΄ λΆλͺ¨μ μμ±λ€μ μμμ΄ λ¬Όλ €λ°μμ μ¬μ©ν μ μλλ‘ νλ κ΄κ³μ΄λ€. λΆλͺ¨μ μμ±μ λ¬Όλ €λ°κΈ° λλ¬Έμ, μμμ λΆλͺ¨μ μ½λλ₯Ό μμ±νμ§ μκ³ μ¬μ©ν¨μΌλ‘μ¨ κ΅¬ννκΈ°κ° μμν΄μ§λ€.
- μμμ μ΄μ©νλ©΄ μ€λ³΅ μ½λλ₯Ό μμ±νμ§ μλλ€λ μ₯μ μ΄ μμ§λ§, μ΄λ‘ μΈν΄ λΆλͺ¨ ν΄λμ€μ κ°ν κ²°ν©λλ₯Ό κ°μ§κ² λ¨μΌλ‘μ¨ λ³νμ λμνκΈ°κ° μ΄λ €μμ§λ€. (OCP μμΉ μλ°°)
- λΆλͺ¨μ μμ±λ€μ λͺ¨λ μ¬μ©νμ§ μλ κ²½μ°μ μμμ μ¬μ©νλ©΄ μ μ§λ³΄μκ° μ΄λ €μμ§λ€. (LSP μλ°°)
ν©μ±μ has a κ΄κ³λ‘ ν ν΄λμ€κ° λ€λ₯Έ ν΄λμ€λ₯Ό μΈμ€ν΄μ€ λ³μλ‘ κ°μ§κ³ μλ μνμ΄λ€.
- μμμ λΉν΄ κ²°ν©μ΄ λμ¨νλ€. κ·Έλ¬λ μμμ λΉν΄ μ€λ³΅ μ½λκ° λ§μμ§λ€. (DRY = Do Not Repeat Yourself, SW κ°λ° μμΉ μλ°°)
μμμ uses a κ΄κ³λ‘ ν΄λμ€ λ΄μμ μμ κ΄κ³μ μλ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό κ°μ§κ³ μλ μνμ΄λ€. λ€μ λ§ν΄, Compositionκ³Ό Forwardingμ ν©μ³€λ€κ³ λ³Ό μ μλ€. μμμ΄ ν΄λμ€ μ¬μ΄μ κ΄κ³λΌλ©΄, μμμ μΈμ€ν΄μ€ μ¬μ΄μ κ΄κ³μ΄λ€.
- μμ κ΄κ³λ μ μ μΈ κ΄κ³λ‘ μ»΄νμΌ μκ°μ λͺ¨λ κ΄κ³κ° μ ν΄μ§κ³ λ³κ²½λ μ μμ§λ§, μμ κ΄κ³λ λμ μΈ κ΄κ³λ‘ λ°νμ μκ° λμ κ΄κ³κ° λ³κ²½λ μ μλ€.
[μμ μ½λ]
// Adaptee : ν΄λΌμ΄μΈνΈμμ μ¬μ©νκ³ μΆμ κΈ°μ‘΄μ μλΉμ€ (νμ§λ§ νΈνμ΄ μλμ λ°λ‘ μ¬μ© λΆκ°λ₯)
class Service {
void specificMethod(int specialData) {
System.out.println("κΈ°μ‘΄ μλΉμ€ κΈ°λ₯ νΈμΆ + " + specialData);
}
}
// Client Interface : ν΄λΌμ΄μΈνΈκ° μ κ·Όν΄μ μ¬μ©ν κ³ μμ€μ μ΄λν° λͺ¨λ
interface Target {
void method(int data);
}
// Adapter : Adaptee μλΉμ€λ₯Ό ν΄λΌμ΄μΈνΈμμ μ¬μ©νκ² ν μ μλλ‘ νΈν μ²λ¦¬ ν΄μ£Όλ μ΄λν°
class Adapter implements Target {
Service adaptee; // compositionμΌλ‘ Service κ°μ²΄λ₯Ό ν΄λμ€ νλλ‘
// μ΄λν°κ° μΈμ€ν΄μ€νλλ©΄ νΈνμν¬ κΈ°μ‘΄ μλΉμ€λ₯Ό μ€μ
Adapter(Service adaptee) {
this.adaptee = adaptee;
}
// μ΄λν°μ λ©μλκ° νΈμΆλλ©΄, Adapteeμ λ©μλλ₯Ό νΈμΆνλλ‘
public void method(int data) {
adaptee.specificMethod(data); // μμ
}
}
μΆμ²: <https://inpa.tistory.com/entry/GOF-π -μ΄λν°Adaptor-ν¨ν΄-μ λλ‘-λ°°μ보μ#μ΄λν°_ν¨ν΄_ꡬ쑰> [Inpa Dev π¨π»:ν°μ€ν 리]
class Client {
public static void main(String[] args) {
// 1. μ΄λν° μμ± (κΈ°μ‘΄ μλΉμ€λ₯Ό μΈμλ‘ λ°μ νΈν μμ
μ²λ¦¬)
Target adapter = new Adapter(new Service());
// 2. Client Interfacμ μ€νμ λ°λΌ λ©μλλ₯Ό μ€ννλ©΄ κΈ°μ‘΄ μλΉμ€μ λ©μλκ° μ€νλλ€.
adapter.method(1);
}
}
μΆμ²: <https://inpa.tistory.com/entry/GOF-π -μ΄λν°Adaptor-ν¨ν΄-μ λλ‘-λ°°μ보μ#μ΄λν°_ν¨ν΄_ꡬ쑰> [Inpa Dev π¨π»:ν°μ€ν 리]
π μμμ μ¬μ©ν μ΄λν° = ν΄λμ€ μ΄λν°(Class Adaptor)
κ°μ²΄ μ΄λν°μ ꡬμ±μ λμΌνμ§λ§, ꡬν λ°©μμ΄ λ€λ¦ λλ€. ‘μμ’μ μ΄μ©ν΄ ꡬννκΈ° λλ¬Έμ, κ°μ²΄ ꡬν μμ΄ λ°λ‘ μ½λ μ¬μ¬μ©μ΄ κ°λ₯ν©λλ€. κ·Έλ¬λ μλ°μμλ λ€μ€ μμμ΄ μλλ―λ‘ λ³΄ν΅ implements, extends νμ¬ κ΅¬νν©λλ€.
// Adaptee : ν΄λΌμ΄μΈνΈμμ μ¬μ©νκ³ μΆμ κΈ°μ‘΄μ μλΉμ€ (νμ§λ§ νΈνμ΄ μλμ λ°λ‘ μ¬μ© λΆκ°λ₯)
class Service {
void specificMethod(int specialData) {
System.out.println("κΈ°μ‘΄ μλΉμ€ κΈ°λ₯ νΈμΆ + " + specialData);
}
}
// Client Interface : ν΄λΌμ΄μΈνΈκ° μ κ·Όν΄μ μ¬μ©ν κ³ μμ€μ μ΄λν° λͺ¨λ
interface Target {
void method(int data);
}
// Adapter : Adaptee μλΉμ€λ₯Ό ν΄λΌμ΄μΈνΈμμ μ¬μ©νκ² ν μ μλλ‘ νΈν μ²λ¦¬ ν΄μ£Όλ μ΄λν°
class Adapter extends Service implements Target {
// μ΄λν°μ λ©μλκ° νΈμΆλλ©΄, λΆλͺ¨ ν΄λμ€ Adapteeμ λ©μλλ₯Ό νΈμΆ
public void method(int data) {
specificMethod(data);
}
}
μΆμ²: <https://inpa.tistory.com/entry/GOF-π -μ΄λν°Adaptor-ν¨ν΄-μ λλ‘-λ°°μ보μ#μ΄λν°_ν¨ν΄_ꡬ쑰> [Inpa Dev π¨π»:ν°μ€ν 리]
class Client {
public static void main(String[] args) {
// 1. μ΄λν° μμ±
Target adapter = new Adapter();
// 2. μΈν°νμ΄μ€μ μ€νμ λ°λΌ λ©μλλ₯Ό μ€ννλ©΄ κΈ°μ‘΄ μλΉμ€μ λ©μλκ° μ€νλλ€.
adapter.method(1);
}
}
μΆμ²: <https://inpa.tistory.com/entry/GOF-π -μ΄λν°Adaptor-ν¨ν΄-μ λλ‘-λ°°μ보μ#μ΄λν°_ν¨ν΄_ꡬ쑰> [Inpa Dev π¨π»:ν°μ€ν 리]
π‘ λ§λ¬΄λ¦¬
μ΄λν° ν¨ν΄μ
- κΈ°μ‘΄ ν΄λμ€λ₯Ό μ¬μ©νκ³ μΆμ§λ§ κ·Έ μΈν°νμ΄μ€κ° λλ¨Έμ§ μ½λμ νΈνλμ§ μμ λ
- μ΄λ―Έ λ§λ κ²μ μ¬μ¬μ©νκ³ μ νλ μ΄ μ¬μ¬μ© κ°λ₯ν λΌμ΄λΈλ¬λ¦¬λ₯Ό μμ ν μ μμ λ
- μμ ν΄λμ€μ κΈ°λ₯μ μΆκ°νκ³ μΆμ§λ§ λΆλͺ¨ ν΄λμ€μλ μΆκ°νκΈ° μ΄λ €μΈ λ
μ μ¬μ©ν μ μμ΅λλ€.
SRPμ OCPλ₯Ό λ§μ‘±ν μ μλ λ°λ©΄, λ€μμ μλ‘μ΄ μΈν°νμ΄μ€μ ν΄λμ€λ€μ λμ ν΄μΌ νλ―λ‘, μ½λμ μ λ°μ μΈ λ³΅μ‘μ±μ΄ μ¦κ°ν©λλ€.