[OOP] κ°μ²΄μ§ν₯ μ€κ³ μμΉ 5κ°μ§
μλ‘
λ€λ€ κ°μ²΄μ§ν₯ μ€κ³μ 5μμΉμ΄λΌκ³ λΆλ¦¬λ SOLIDμ λν΄μ νλ²μ―€μ λ€μ΄λ΄€μ κ²λλ€. κ°μ²΄μ§ν₯μμ κΌ μ§μΌμΌν 5κ°μ μμΉμ ν΅νμ΄ 5μμΉμ΄λΌκ³ μΉνκ³ , μ΄ 5κ°μ μμΉμ μκΈμλ₯Ό λ°μ SOLIDλΌκ³ λ λΆλ¦
λλ€. ν΄λ¦°μ½λμ μ μλ‘ μ λͺ
ν λ‘λ²νΈ λ§ν΄μ΄ 2000λ
λ μ΄λ°μ λͺ
λͺ
νμμΌλ©°, νλ‘κ·Έλλ¨Έκ° μκ°μ΄ μ§λλ μ μ§ λ³΄μμ νμ₯μ΄ μ¬μ΄ μμ€ν
μ λ§λ€κ³ μ ν λ μ΄ μμΉλ€μ ν¨κ» μ μ©ν μ μμ΅λλ€.
κ°κ°μ μμΉλ€μ μλμ κ°μ΅λλ€.
- λ¨μΌ μ± μ μμΉ(SRP, Single Responsibility Principle)
- κ°λ°© νμ μμΉ(OCP, Open-Closed Principle)
- 리μ€μ½ν μΉν μμΉ(LSP, Liskov Subsituation Principle)
- μΈν°νμ΄μ€ λΆλ¦¬ μμΉ(ISP, Interface Segragation Principle)
- μμ‘΄κ΄κ³ μμ μμΉ(DIP, Dependency Inversion Principle)
1. λ¨μΌ μ± μ μμΉ(SRP, Single Responsibility Principle)
μ΄λ€ ν΄λμ€λ₯Ό λ³κ²½ν΄μΌ νλ μ΄μ λ μ€μ§ νλλΏμ΄μ΄μΌ νλ€. - λ‘λ²νΈ C.λ§ν΄
νλμ ν΄λμ€λ νλμ μ±
μλ§ κ°μ ΈμΌ ν©λλ€. μ±
μμ΄λ κΈ°μ€μ΄ λͺ¨νΈνκ³ λ¬Έλ§₯κ³Ό μν©μ λ°λΌ λ€λ₯΄κΈ° λλ¬Έμ λ³κ²½μ μ±
μμ κΈ°μ€μΌλ‘ μΌμΌλ©΄ μ€κ³μ μ©μ΄ν μ μμ΅λλ€. λ³κ²½μ΄ μμ λ νκΈ ν¨κ³Όκ° μ μΌλ©΄ λ¨μΌ μ±
μ μμΉμ μ μ§ν¨ κ²μΌλ‘ λ³Ό μ μμ΅λλ€.
κ°λ¨ν μλ₯Ό λ€μ΄μ νμ κ°μ
μͺ½μ APIλ₯Ό λ΄λΉνλ Classκ° μλ€κ³ κ°μ νμ λ, κ·Έ μμλ νμκ°μ
μ ν΄λΉνλ κΈ°λ₯λ€λ§ μμ΄μΌ ν©λλ€. κ·Έλμ λ§μ½ νμκ°μ
κΈ°λ₯μ μμ νκ³ μ νλ€λ©΄ μ€μ§ μ΄ νμκ°μ
Classλ§ μμ ν΄μΌ ν κ²μ
λλ€.
λ§μ½ λ¨μΌ μ±
μ μμΉμ μ§ν€μ§ μμμ κ²½μ°(νλμ Classμ λ€μν κΈ°λ₯μ΄ λ€μ΄κ° κ²½μ°) ν΄λΉ Classλ₯Ό μμ νμ λ λ€λ₯Έ λͺ¨λμ μ΄λ ν μν₯μ λ―ΈμΉλ μ§ κ·Έ λ²μλ₯Ό μΆμΈ‘νκΈ° νλ€ μ μμ΅λλ€.
2. κ°λ°© νμ μμΉ(OCP, Open-Closed Principle)
μννΈμ¨μ΄ μμ(μν°ν°, ν΄λμ€, λͺ¨λ, ν¨μ, λ±)λ νμ₯μ λν΄μλ μ΄λ €μμ΄μΌ νμ§λ§ λ³κ²½μ λν΄μλ λ«ν μμ΄μΌ νλ€. - λ‘λ²νΈ C.λ§ν΄
μ¦, μμ μ νμ₯μλ μ΄λ € μκ³ , μ£Όλ³μ λ³νμ λν΄μλ λ«ν μμ΄μΌ ν©λλ€. μ΄λ λ³κ²½μ΄ μΌμ΄λλλΌλ κΈ°μ‘΄μ ꡬμ±μμμ λν΄μλ μμ μ΄ μΌμ΄λμ§ μμμΌ νλ©°, μ½κ² νμ₯μ΄ κ°λ₯νμ¬ μ¬μ¬μ©μ ν μ μλλ‘ ν΄μΌνλ€λ μλ―Έμ
λλ€.
μ¬κΈ°μμ μ€μν κ²μ μΆμνμ λ€νμ±μ
λλ€. κ°μ²΄ μ§ν₯μμ λ€νμ±μ΄λ μ¬λ¬ κ°μ§ ννλ₯Ό κ°μ§ μ μλ λ₯λ ₯μ μλ―Έν©λλ€. λ°λΌμ κ²°κ³Όμ μΌλ‘ κ°λ°© νμ μμΉμ μΆμνλ₯Ό μλ―Ένλ κ²μΌλ‘ ν΄μλ©λλ€. κ°μ²΄λ₯Ό μΆμνν¨μΌλ‘μ¨ νμ₯μ μ΄λ €μκ³ , λ³κ²½μ λ«νμλ μ μ°ν ꡬ쑰λ₯Ό λ§λ€ μ μλ κ²μ
λλ€.
λ°λΌμ κ°λ°© νμ μμΉμ 무μνλ€λ©΄ μ μ°μ±, μ¬μ¬μ©μ±, μ μ§λ³΄μμ± λ±μ μ»μ μ μλ€λΌκ³ ν μ λλ‘ μ€μν μμΉμ΄λΌκ³ λ³Ό μ μμ΅λλ€.
3. 리μ€μ½ν μΉν μμΉ(LSP, Liskov Subsituation Principle)
μλΈ νμ
μ μΈμ λ μμ μ κΈ°λ° νμ
μΌλ‘ κ΅μ²΄ν μ μμ΄μΌ νλ€. - λ‘λ²νΈ C.λ§ν΄
wikiλ°±κ³Όμμλ "μλ£ν Sκ° μλ£ν Tμ νμνμ΄λΌλ©΄ νμν νλ‘κ·Έλ¨μ μμ±μ λ³κ²½μμ΄ μλ£ν Tμ κ°μ²΄λ₯Ό μλ£ν Sμ κ°μ²΄λ‘ κ΅μ²΄(μΉν) ν μ μμ΄μΌ νλ€."λΌκ³ μ€λͺ
νκ³ μμ΅λλ€.
μ½κ² λ§ν΄μ λΆλͺ¨ Classκ° λ€μ΄κ° μ리μ μμ Classλ₯Ό λ£μ΄λ μ μλν΄μΌνλ€λ μμΉμ
λλ€.
리μ€μ½ν μΉν μμΉμ μ€λͺ
νλ κ°μ₯ λνμ μΈ μκ° 'μ§μ¬κ°ν - μ μ¬κ°ν λ¬Έμ 'μ
λλ€. μ°λ¦¬λ μ§μ¬κ°νμ μ μ¬κ°νμ΄ μλμ§λ§, μ μ¬κ°νμ μ§μ¬κ°νμ΄λΌλ μ¬μ€μ μκ³ μμ΅λλ€.
λ¨Όμ μ§μ¬κ°νμ νΉμ§μ μλμ κ°μ΅λλ€.
- λ΄κ°μ ν©μ 360μ΄λ©°, μ§μ¬κ°νμ λ€ κ°μ λμΌνκ² 90λλ₯Ό μ΄λ£¬λ€.
- μ§μ¬κ°νμ λκ°μ μ μλ‘ λ€λ₯Έ λκ°μ μ μ΄λ±λΆνλ€.
- λ μμ λ³μ΄ κ°κ° μλ‘ νννλ€.
- λλΉλ μΈλ‘λ³ * κ°λ‘λ³μ΄λ€.
μ μ¬κ°νμ νΉμ§μ μ§μ¬κ°νμ νΉμ§μ μΆκ°λ‘ 5. λ€ λ³μ κΈΈμ΄κ° λͺ¨λ κ°λ€ λΌλ νΉμ§μ κ°μ§λλ€.
- λ΄κ°μ ν©μ 360μ΄λ©°, μ§μ¬κ°νμ λ€ κ°μ λμΌνκ² 90λλ₯Ό μ΄λ£¬λ€.
- μ§μ¬κ°νμ λκ°μ μ μλ‘ λ€λ₯Έ λκ°μ μ μ΄λ±λΆνλ€.
- λ μμ λ³μ΄ κ°κ° μλ‘ νννλ€.
- λλΉλ μΈλ‘λ³ * κ°λ‘λ³μ΄λ€.
- λ€ λ³μ κΈΈμ΄κ° λͺ¨λ κ°λ€.
μ§μ¬κ°νμ΄λΌλ ν° λΆλͺ¨ μμμ μ μ¬κ°νμ΄λΌλ μμμ΄ ν¬ν¨λλ€κ³ λ³Ό μ μμ΅λλ€. κ·Έλμ μνμ μΌλ‘ λ΄€μ λλ μ μ¬κ°νμ μ§μ¬κ°νμ΄λ€ λΌλ 쑰건μ μΆ©μ‘±ν©λλ€. λ°λΌμ μ μ¬κ°ν μμ λκ² λ³΄λ©΄ μ§μ¬κ°νμ ν μ’
λ₯μ΄λ, μ§μ¬κ°νμ μμνμ¬ μ μ¬κ°ν κ°μ²΄λ₯Ό λΉ λ₯΄κ² λ§λ€ μ μμ κ²μ΄λΌ μκ°ν μ μμ΅λλ€.
κ·ΈλΌ νλ² μ κ°λ
μ κΈ°μ€μΌλ‘ 리μ€μ½ν μμΉμ μ€μνλ μ½λμ μλ°°νλ μ½λλ₯Ό νλ² μ΄ν΄λ³΄κ² μ΅λλ€.
리μ€μ½ν μΉν μμΉμ μλ°°νλ μ½λ
public class Rectangle {
private int width;
private int height;
public void setWidth(final int width) {
this.width = width;
}
public void setHeight(final int height) {
this.height = height;
}
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
}
μμκ°μ μ§μ¬κ°ν(Rectangle)μ κ°μ²΄κ° μλ€κ³ κ°μ ν©μλ€.
public class Square extends Rectangle {
@Override
public void setWidth(final int width) {
super.setWidth(width);
super.setHeight(width);
}
@Override
public void setHeight(final int height) {
super.setWidth(height);
super.setHeight(height);
}
}
κ·Έλ¦¬κ³ μ μ¬κ°ν(Square)λ μ§μ¬κ°ν(Rectangle)μ μμλ°μμ μμ²λΌ ꡬννλ€κ³ κ°μ ν©μλ€.
μ μ¬κ°ν(Square)μ κ²½μ° μ§μ¬κ°ν(Rectangle)κ³Ό λ¬λ¦¬ λλΉμ λμ΄κ° κ°μΌλ, λλΉλ λμ΄λ₯Ό μ§μ νλ©΄ κ·Έμ λ§κ² λλΉμ λμ΄λ₯Ό λͺ¨λ μΌμΉμμΌ μ£Όλλ‘ νκΈ° μν΄μ μ€λ²λΌμ΄λ©μ ν΅ν΄ λ©μλλ₯Ό μ¬μ μνμ΅λλ€.
μ΄μ μ§μ¬κ°ν(Rectangle)μ λμ΄λ₯Ό ꡬν΄λ΄
μλ€.
public class Main{
public static void main(String[] args){
Rectangle rectangle = new Rectangle();
rectangle.setWidth(10);
rectangle.setHeight(5);
System.out.println(rectangle.getArea()); // μΆλ ₯: 50
}
}
μ§μ¬κ°ν(Rectangle)μ λμ΄λ₯Ό ꡬνλ μμ€λ μμ κ°μ΅λλ€. λλΉκ° 10, λμ΄λ₯Ό 5λ‘ ν λΉνμΌλ―λ‘ λμ΄ 50μ΄ μ μμ μΌλ‘ μΆλ ₯λμ΅λλ€.
리μ€μ½ν μΉν μμΉμ μνλ©΄, μμ κ°μ²΄λ λΆλͺ¨λ₯Ό μμ ν λ체ν μ μλ€κ³ νμΌλ―λ‘, μ§μ¬κ°ν(Rectangle)μ μμλ°μ μ μ¬κ°ν(Square)λ‘ λ체νμ¬ νλ² λμ΄λ₯Ό ꡬν΄λ΄
μλ€.
public class Main{
public static void main(String[] args) {
Rectangle rectangle = new Square();
rectangle.setWidth(10);
rectangle.setHeight(5);
System.out.println(rectangle.getArea()); // μΆλ ₯: 25
}
}
μ μ¬κ°ν(Square)κ° μ§μ¬κ°ν(Rectangle)μ μμ ν λ체νλ€λ©΄ λμΌν κ²°κ³ΌμΈ 50μ΄ λ°νλμ΄μΌ νμ§λ§ μ΄μ§ΈμμΈμ§ λμ΄λ 50μ΄ μλ 25λ‘ λ°νλμμ΅λλ€. μμΈν μ΄ν΄λ³΄λ©΄, λ§μ§λ§μ μνλ setHeight(5)κ° κ°μ²΄μ λλΉ/λμ΄λ₯Ό λͺ¨λ 5λ‘ ν λΉνμ΅λλ€. κ·Έλμ λμ΄λ 25λ‘ μΆλ ₯μ΄ λμμ΅λλ€.
μ¦, μ΄ κ°μ²΄λ 리μ€μ½ν μΉν μμΉμ μλ°°λλ μ½λμ
λλ€. μ΄λ κ² μλͺ»λ κ°μ²΄λ₯Ό μμνκ±°λ, μ¬λ°λ₯΄κ² νμ₯νμ§ λͺ» ν κ²½μ° κ²μΌλ‘ 보기μ μ μμ μΌλ‘ 보μ΄μ§λ§ μ¬λ°λ₯Έ κ°μ²΄κ° μλλλ€.
κ·Έλ λ€λ©΄ μ΄λ»κ² μ μ½λλ₯Ό 리μ€μ½ν μΉν μμΉμ λΆν©νκ²λ ꡬμ±ν μ μμκΉμ?
μ λ΅μ μ¬λ°λ₯Έ μμκ³Ό ꡬνμ μμ΅λλ€. μμ μ€λͺ
νλ€μνΌ, μ§μ¬κ°νκ³Ό μ μ¬κ°νμ μμμ κ΄κ³κ° μ±λ¦½λκΈ° μ΄λ ΅μ΅λλ€. λ°λΌμ μ΄λ³΄λ€ λ μμ κ°λ
μΈ μ¬κ°ν κ°μ²΄λ₯Ό ꡬννκ³ μ μ¬κ°ν, μ§μ¬κ°νμ΄ μ΄λ₯Ό μμλ°λλ‘ κ΅¬νν μ μμ΅λλ€.
리μ€μ½ν μΉν μμΉμ μ€μνλ μ½λ
/**
* μ¬κ°ν ν΄λμ€
*/
public class Shape{
protected int width;
protected int height;
public int getWidth(){
return width;
}
public int getHeight(){
return height;
}
public void setWidth(int width){
this.width = width;
}
public void setHeight(int height){
this.height = height;
}
public int getArea(){
return width * height;
}
}
μμ κ°μ΄ ShapeλΌλ μ¬κ°ν κ°μ²΄λ₯Ό ꡬνν μ μμ΅λλ€.
/**
* μ§μ¬κ°ν ν΄λμ€
*/
class Rectangle extends Shape{
public Rectangle(int width, int height){
setWidth(width);
setHeight(height);
}
}
/**
* μ μ¬κ°ν ν΄λμ€
*/
class Square extends Shape{
public Square(int length){
setWidth(length);
setHeight(length);
}
}
μ¬κ°ν(Shape)λ₯Ό μμλ°λ μ§μ¬κ°ν(Rectangle)κ³Ό μ μ¬κ°ν(Square) κ°μ²΄λ μμ κ°μ΅λλ€. μ§μ¬κ°ν(Rectangle)μ μΈμ€ν΄μ€ μμ± μ widthμ heightλ₯Ό νλΌλ―Έν°λ‘ λ°μΌλ©°, μ μ¬κ°ν(Square)λ κ° λ²½μ κΈΈμ΄κ° λͺ¨λ λμΌνλ―λ‘ length νλλ§μ νλΌλ―Έν°λ‘ λ°μ΅λλ€.
public class Main{
public static void main(String[] args){
Shape rectangle = new Rectangle(10, 5);
Shape square = new Square(5);
System.out.println(rectangle.getArea()); // μΆλ ₯: 50
System.out.println(square.getArea()); // μΆλ ₯: 25
}
}
μ΄μ λ μ΄μ μ§μ¬κ°ν(Rectangle)κ³Ό μ μ¬κ°ν(Square)μ΄ μμκ΄κ³κ° μλλ―λ‘, 리μ€μ½ν μΉν μμΉμ μν₯μμ λ²μ΄λκ² λμμ΅λλ€.
μ 리
리μ€μ½ν μΉν μμΉμ μμλλ κ°μ²΄λ λΆλͺ¨ κ°μ²΄λ₯Ό μμ ν λμ²ν΄λ μλ¬΄λ° λ¬Έμ κ° μμ΄μΌ νλ€κ³ κΆκ³ ν©λλ€. μμ μ§μ¬κ°νκ³Ό μ μ¬κ°νμ μΌμ΄μ€μ²λΌ μ¬λ°λ₯΄μ§ λͺ»ν μμκ΄κ³λ μ κ±°νκ³ , λΆλͺ¨ κ°μ²΄μ λμμ μλ²½νκ² λ체ν μ μλ κ΄κ³λ§ μμνλλ‘ μ½λλ₯Ό μ€κ³ν΄μΌ ν©λλ€.
4. μΈν°νμ΄μ€ λΆλ¦¬ μμΉ(ISP, Interface Segragation Principle)
ν΄λΌμ΄μΈνΈλ μμ μ΄ μ¬μ©νμ§ μλ λ©μλμ μμ‘΄ κ΄κ²λ₯Ό λ§ΊμΌλ©΄ μλλ€. - λ‘λ²νΈ C.λ§ν΄
μ¦, μμ μ΄ μ¬μ©νμ§ μλ μΈν°νμ΄μ€λ ꡬννμ§ λ§μμΌ νλ€λ μμΉμ
λλ€. λ€μ λ§νλ©΄, νλμ ν° μΈν°νμ΄μ€λ₯Ό μμ λ°κΈ° 보λ€λ μΈν°νμ΄μ€λ₯Ό ꡬ체μ μ΄κ³ μμ λ¨μλ€λ‘ λΆλ¦¬μμΌ κΌ νμν μΈν°νμ΄μ€λ§ μμνμ λΌλ μλ―Έμ
λλ€.
SRP(λ¨μΌ μ±
μ μμΉ)κ° ν΄λμ€μ λ¨μΌ μ±
μ μμΉμ κ°μ‘°νλ€λ©΄ ISP(μΈν°νμ΄μ€μ λΆλ¦¬ μμΉ)λ μΈν°νμ΄μ€μ λ¨μΌμ±
μμ κ°μ‘°ν©λλ€.
5. μμ‘΄κ΄κ³ μμ μμΉ(DIP, Dependency Inversion Principle)
κ³ μ°¨μ λͺ¨λμ μ μ°¨μ λͺ¨λμ μμ‘΄νλ©΄ μ λλ€. μ΄ λ λͺ¨λ λͺ¨λ λ€λ₯Έ μΆμνλ κ²μ μμ‘΄ν΄μΌ νλ€. μΆμνλ κ²μ ꡬ체μ μΈ κ²μ μμ‘΄νλ©΄ μ λλ€. ꡬ체μ μΈ κ²μ΄ μΆμνλ κ²μ μμ‘΄ν΄μΌ νλ€. μμ£Ό λ³κ²½λλ ꡬ체(Concrete) ν΄λμ€μ μμ‘΄νμ§ λ§λΌ - λ‘λ²νΈ C.λ§ν΄
μ¦, νλ‘κ·Έλλ¨Έλ ꡬ체νκ° μλλΌ μΆμνμ μμ‘΄ν΄μΌ νλ©°, ꡬν ν΄λμ€(ꡬν체)κ° μλλΌ μΈν°νμ΄μ€(μν )μ μμ‘΄νλΌλ μ΄μΌκΈ°μ
λλ€.
λ§μ½ μλμ°¨κ° νμ΄μ΄μ μμ‘΄νλ©΄ μ΄λ»κ² λ κΉμ? μλμ°¨ νμ΄μ΄λ μμ£Ό λ°λκ² λλ κ² μ€ νλμ λλ€. λ°λΌμ μ΄λ κ² λ°λλ κ²μ μμ‘΄νλ©΄ μλμ°¨λ μμ£Ό μν₯μ λ°κ² λκ² λ©λλ€. μ¦, μλμ°¨ μμ λ³΄λ€ λ μμ£Ό λ³νλ νμ΄μ΄μ μμ‘΄νλ κ²μ μ’μ§ μμμ μ μ μμ΅λλ€.
λ°λΌμ μμ²λΌ μλμ°¨κ° κ΅¬μ²΄μ μΈ νμ΄μ΄κ° μλ μΆμνλ νμ΄μ΄ μΈν°νμ΄μ€μλ§ μμ‘΄νκ² ν¨μΌλ‘μ¨ νμ΄μ΄κ° λ³κ²½λλλΌλ μλμ°¨κ° μν₯μ λ°μ§ μκ² κ΅¬νν¨μΌλ‘μ¨ μμ‘΄κ΄κ³ μμ μμΉμ μ§ν¬ μ μμ΅λλ€.