π κ°μ²΄μ§ν₯ 5μμΉ(SOLID)
SOLIDλ κ°μ²΄μ§ν₯ 5μμΉμ λμμ λ°μ λ§λ λ§μ΄λ€. κ°κ° λμ΄νμλ©΄,
- SRP(λ¨μΌ μ± μ μμΉ)
- OCP(κ°λ°© νμ μμΉ)
- LSP(리μ€μ½ν μΉν μμΉ)
- ISP(μΈν°νμ΄μ€ λΆλ¦¬ μμΉ)
- DIP(μμ‘΄κ΄κ³ μμ μμΉ)
μμ κ°μ΄ μ‘΄μ¬νλ€. μ΄ μ€ μ€λ μ΄μΌκΈ°ν Covariant(μ΄ν 곡λ³μ±)μ κ΄ν μ΄μΌκΈ°κ° μν κ³³μ LSP(Liskov Substitution Principle)λ€.
π LSPλ?
LSPλ νμ Sκ° νμ Tμ μλΈνμ μ΄λΌλ©΄ νλ‘κ·Έλ¨μ μμ± λ³κ²½ μμ΄ Tνμ μ κ°μ²΄λ₯Ό Sνμ μΌλ‘ μΉνν μ μμ΄μΌ νλ€.λΌλ κ°λ μ΄λ€. μ½κ² λ§νλ©΄, μλΈνμ μ μνΌνμ μ λ체ν μ μμ΄μΌ νλ€λ λ§μ΄λ€.
μλΈνμ μ΄ μνΌνμ μ λ체νλ κ°λ , κ·Έκ²μ΄ λ°λ‘ 곡λ³μ±μ΄λ€. 곡λ³μ±μ μ΄μ©ν νλ‘κ·Έλλ°μ μ₯μ μλ ν¬κ²(?) 3κ°μ§κ° μ‘΄μ¬νλ€.
- λ€νμ± κ΅¬ν
- μμ μ± ν보
- λΆνμν μμ€ μ½λ μ μ½ (νμ μΊμ€ν )
μ΄ν΄λ₯Ό λκΈ° μν μμ λ₯Ό 보μ. ν΄λμ€κ° μ΄ 4κ°μ§λ§, ꡬνλ μμ€μ½λκ° κ°λ¨νλ μ΄ν΄νκΈ° μ΄λ ΅μ§λ μμ κ±°λ€.
public class A {
I method() {
System.out.println("A");
return new I();
}
}
public class B extends A{
J method() {
System.out.println("B");
return new J();
}
public static void test() {
A a = new B();
a.method();
}
public static void main(String[] args) {
B.test();
}
}
public class I {
}
public class J {
}
μμ κ°μ μμ€ μ½λμμ B classμ main λ©μλλ₯Ό runνλ©΄ λμ€λ κ°μ 무μμΌκΉ?
java: method() in B cannot override method() in A
return type J is not compatible with I
μμ κ°μ μλ¬κ° λ°μνλ€. ν΄μνλ©΄, Bμ μλ λ©μλλ Aμ μλ λ©μλλ₯Ό μ€λ²λΌμ΄λ ν μ μλ€.
κ·Έ μ΄μ λ Jνμ
μ Iνμ
κ³Ό νΈνλμ§ μκΈ° λλ¬Έμ΄λ€.
μ, μ΄μ μλ¬λ₯Ό ν΄κ²°νλ €λ©΄ 무μμ΄ νμνκ°? Iμ Jμ κ΄κ³λ₯Ό μ€μ ν΄μ£Όλ©΄ λλ€.
public class J extends I {
}
μμ κ°μ΄ Jλ₯Ό Iλ‘λΆν° μμλ°λ ν΄λμ€λ‘ λ§λ€λ©΄ λ μ΄μ λ¬Έμ κ° μλ€. μλνλ©΄, Jλ Iλ₯Ό μλ²½νκ² λ체ν μ μκΈ° λλ¬Έμ΄λ€.(LSP μμΉ) κ·Έλ λ€λ©΄, μλμ κ°μ μμ λ μ΄λ€κ°? μλ 4κ°μ λ©μλ μ€ μ΄λ€ κ²μ΄ μλͺ»λ κ²μΈμ§ μ μ μλ€λ©΄, λΉμ μ 곡λ³μ±μ μ΄ν΄νλ€.
public class B extends A{
J method() {
System.out.println("B");
return new J();
}
public static I one() {
A a = new B();
return a.method(); // return I
}
public static I two() {
B b = new B();
return b.method(); // return J
}
public static J three() {
A a = new B();
return a.method(); // return I
}
public static J four() {
B b = new B();
return b.method(); // return J
}
public static void main(String[] args) {
B.one();
B.two();
B.three();
B.four();
}
}
μ λ΅μ 3λ² three() λ©μλκ° μλ¬κ° λ°μνλ€. κ·Έ μ΄μ λ μ£Όμμλ 보μ΄λ―μ΄ J νμ μ λ°νν΄μΌ νλ λ©μλμμ a.method()λ I νμ μ λ°ννκΈ° λλ¬Έμ΄λ€.
μ¬κΈ°μ νλ μ§κ³ λμ΄κ°μΌνλ κ²μ LSPλ 곡λ³μ±μ μΈμ νμ§, μ곡λ³μ±μ μΈμ νμ§ μλλ€. μ¦, μνΌνμ μ μλΈνμ μ μμ ν λ체ν νμκ° μλ€. μ¦, Iλ₯Ό μμλ°λ Jλ Jκ° Iνμ κ³Ό κ°λ€κ³ λ΄λ 무방νμ§λ§, Iκ° Jνμ κ³Ό κ°λ€κ³ λ λ³Ό μ μλ€.
μ΄λ λλ¬Όμ λΉμ νλ©΄ μ½λ€. λλ¬Όκ³Ό νΈλμ΄ ν΄λμ€κ° μλ€κ³ κ°μ νμ. νΈλμ΄λ λλ¬ΌμΈκ°? κ·Έλ λ€. κ·Έλ λ€λ©΄, λλ¬Όμ νΈλμ΄μΈκ°? μ΄ λ§μ λΆλͺ ν λͺ¨μμ΄ μλ€. λλ¬Όμ νΈλμ΄λ λ μ μμ§λ§, λ€λ₯Έ λλ¬Όλ λ μ μκΈ° λλ¬Έμ΄λ€. μ곡λ³μ±μ μΈμ νμ§ μλ κ²μ μ΄ μμλ‘ μ€λͺ μ΄ λλ€. Jλ Iμ μν΄ μμ§λ§, Iλ Jκ° λ μλ μκ³ λ€λ₯Έ κ²μ΄ λ μλ μκΈ° λλ¬Έμ λ± μ§μ ν μ μλ€.
λν, threeλ©μλλ₯Ό 보면 λΆλͺ
ν B μμ±μλ₯Ό ν΅ν΄ κ°μ²΄λ₯Ό μμ±νλλ° μ Jκ° μλ Iλ₯Ό 리ν΄νλμ§ κΆκΈν μ μλ€. μ΄κ²μ μμ±μλ³΄λ€ λ³μμ νμ
μ΄ λ μ€μνλ°, λ³μμ νμ
μ΄ Aμ΄κΈ° λλ¬Έμ Aμμ μμ±λ 리ν΄κ°μ λ°ννκΈ° λλ¬Έμ΄λ€. (κ·Έλ°λ°, νλ¦°νΈ κ°μλ Bκ° μ°νλλ°, μ΄κ²μ λν μ νν μ΄μ λ λͺ¨λ₯΄κ² λ€. λ€λ§, νμ¬ λλ κ°μ²΄κ° 리ν΄νλ κ°κ³Ό λ¨μν λ‘μ§μ μ²λ¦¬νλ νλ¦°νΈλ¬Έμ μλ‘ μ²λ¦¬λλ μμκ° λ¬λΌμ λ°μνλ κ²μ΄λΌκ³ μκ°νκ³ μλ€.) ps. νΉμ μ νν μ΄μ λ₯Ό μκ³ κ³μλ€λ©΄ λκΈμ λΆνλ립λλ€.
μ¬ννΌ, three λ©μλλ₯Ό ν΄κ²°νλ λ°©λ² μ€ νλλ νμ μΊμ€ν μ΄ μλ€. return a.method(); μμ (J)λ₯Ό λΆμ¬μ£Όλ©΄ λλ€. μ¦, return (J)a.method();κ° λλ κ²μ΄λ€. κ·Έλ κ² νλ©΄ λ°ννλ κ°μ΄ (J)λ‘ νμ μΊμ€ν μ΄ λκ² λλ€. λ€λ§, μ΄λ κ² νμ μΊμ€ν μ΄ λ무νκ² λλ©΄ κ°λ°μκ° μ€μλ₯Ό νμ λ, μ€λ₯λ₯Ό μ‘κΈ°κ° μ΄λ ΅λ€. κ·Έ μ΄μ λ 곡λ³μ±μ μν νμ μΊμ€ν μ μ»΄νμΌ μλ¬λ₯Ό λ°ννκΈ° λλ¬Έμ μμ€ μ½λ μ체μμ μλ¬ λ΄μ©μ΄ 보μ΄κ³ , νλ‘κ·Έλ¨μ΄ λμνμ§ μμ§λ§, μΌλ°μ μΈ νμ μΊμ€ν μ μν μ€μλ λ°νμ μλ¬λ₯Ό λ°ννλ κ²½μ°κ° λλΆλΆμ΄λΌμ μλ¬ λ΄μ©μ μ°ΎκΈ°λ μ΄λ ΅κ³ , νλ‘κ·Έλ¨μ΄ λμν νμ μλ¬κ° λ°μνκ² λμ΄ μλΉν μνμ΄ μλ€.
κ·Έλ¬λ―λ‘, κ°μ²΄μ§ν₯ μΈμ΄μμλ λλΆλΆμ κ²½μ°μμ LSP(리μ€μ½ν μΉν μμΉ)μ μν μ½λ©μ μ§ν₯νλ λ°μ΄λ€.
'Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java] μμΈ μ²λ¦¬μ μ΄μ μ μ’ λ₯ (2) | 2022.09.20 |
---|---|
[Java] μλ°μ λ°μ΄ν° νμ (0) | 2022.09.04 |
[Java] System ν΄λμ€ (0) | 2022.08.30 |
[Java] main λ©μλ (0) | 2022.08.13 |
[Java] Staticμ κ΄ν μ΄μΌκΈ°.. (0) | 2022.07.18 |