λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
BackEnd🌱/Java

[OOP] 객체지ν–₯ 섀계 원칙 5가지

by μ•ˆμ£Όν˜• 2022. 6. 2.

μ„œλ‘ 

λ‹€λ“€ 객체지ν–₯ μ„€κ³„μ˜ 5원칙이라고 λΆˆλ¦¬λŠ” SOLID에 λŒ€ν•΄μ„œ ν•œλ²ˆμ―€μ„ 듀어봀을 κ²λ‹ˆλ‹€. 객체지ν–₯μ—μ„œ κΌ­ μ§€μΌœμ•Όν•  5개의 원칙을 톡틀어 5원칙이라고 μΉ­ν•˜κ³ , 이 5개의 μ›μΉ™μ˜ μ•žκΈ€μžλ₯Ό λ”°μ„œ SOLID라고도 λΆ€λ¦…λ‹ˆλ‹€. ν΄λ¦°μ½”λ“œμ˜ μ €μžλ‘œ 유λͺ…ν•œ λ‘œλ²„νŠΈ λ§ˆν‹΄μ΄ 2000λ…„λŒ€ μ΄ˆλ°˜μ— λͺ…λͺ…ν•˜μ˜€μœΌλ©°, ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μ‹œκ°„μ΄ μ§€λ‚˜λ„ μœ μ§€ λ³΄μˆ˜μ™€ ν™•μž₯이 μ‰¬μš΄ μ‹œμŠ€ν…œμ„ λ§Œλ“€κ³ μž ν•  λ•Œ 이 원칙듀을 ν•¨κ»˜ μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
각각의 원칙듀은 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

  1. 단일 μ±…μž„ 원칙(SRP, Single Responsibility Principle)
  2. 개방 폐쇄 원칙(OCP, Open-Closed Principle)
  3. λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙(LSP, Liskov Subsituation Principle)
  4. μΈν„°νŽ˜μ΄μŠ€ 뢄리 원칙(ISP, Interface Segragation Principle)
  5. μ˜μ‘΄κ΄€κ³„ μ—­μ „ 원칙(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λ₯Ό 넣어도 잘 μž‘λ™ν•΄μ•Όν•œλ‹€λŠ” μ›μΉ™μž…λ‹ˆλ‹€.
λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙을 μ„€λͺ…ν•˜λŠ” κ°€μž₯ λŒ€ν‘œμ μΈ μ˜ˆκ°€ 'μ§μ‚¬κ°ν˜• - μ •μ‚¬κ°ν˜• 문제'μž…λ‹ˆλ‹€. μš°λ¦¬λŠ” μ§μ‚¬κ°ν˜•μ€ μ •μ‚¬κ°ν˜•μ΄ μ•„λ‹ˆμ§€λ§Œ, μ •μ‚¬κ°ν˜•μ€ μ§μ‚¬κ°ν˜•μ΄λΌλŠ” 사싀을 μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€.
λ¨Όμ € μ§μ‚¬κ°ν˜•μ˜ νŠΉμ§•μ€ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

  1. λ‚΄κ°μ˜ 합은 360이며, μ§μ‚¬κ°ν˜•μ˜ λ„€ 각은 λ™μΌν•˜κ²Œ 90도λ₯Ό 이룬닀.
  2. μ§μ‚¬κ°ν˜•μ˜ λŒ€κ°μ„ μ€ μ„œλ‘œ λ‹€λ₯Έ λŒ€κ°μ„ μ„ μ΄λ“±λΆ„ν•œλ‹€.
  3. 두 쌍의 변이 각각 μ„œλ‘œ ν‰ν–‰ν•œλ‹€.
  4. λ„ˆλΉ„λŠ” μ„Έλ‘œλ³€ * κ°€λ‘œλ³€μ΄λ‹€.

μ •μ‚¬κ°ν˜•μ˜ νŠΉμ§•μ˜ μ§μ‚¬κ°ν˜•μ˜ νŠΉμ§•μ— μΆ”κ°€λ‘œ 5. λ„€ λ³€μ˜ 길이가 λͺ¨λ‘ κ°™λ‹€ λΌλŠ” νŠΉμ§•μ„ κ°€μ§‘λ‹ˆλ‹€.

  1. λ‚΄κ°μ˜ 합은 360이며, μ§μ‚¬κ°ν˜•μ˜ λ„€ 각은 λ™μΌν•˜κ²Œ 90도λ₯Ό 이룬닀.
  2. μ§μ‚¬κ°ν˜•μ˜ λŒ€κ°μ„ μ€ μ„œλ‘œ λ‹€λ₯Έ λŒ€κ°μ„ μ„ μ΄λ“±λΆ„ν•œλ‹€.
  3. 두 쌍의 변이 각각 μ„œλ‘œ ν‰ν–‰ν•œλ‹€.
  4. λ„ˆλΉ„λŠ” μ„Έλ‘œλ³€ * κ°€λ‘œλ³€μ΄λ‹€.
  5. λ„€ λ³€μ˜ 길이가 λͺ¨λ‘ κ°™λ‹€.

μ§μ‚¬κ°ν˜•μ΄λΌλŠ” 큰 λΆ€λͺ¨ μ•ˆμ—μ„œ μ •μ‚¬κ°ν˜•μ΄λΌλŠ” μžμ‹μ΄ ν¬ν•¨λœλ‹€κ³  λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ μˆ˜ν•™μ μœΌλ‘œ 봀을 λ•ŒλŠ” μ •μ‚¬κ°ν˜•μ€ μ§μ‚¬κ°ν˜•μ΄λ‹€ λΌλŠ” 쑰건을 μΆ©μ‘±ν•©λ‹ˆλ‹€. λ”°λΌμ„œ μ •μ‚¬κ°ν˜• μ—­μ‹œ λ„“κ²Œ 보면 μ§μ‚¬κ°ν˜•μ˜ ν•œ μ’…λ₯˜μ΄λ‹ˆ, μ§μ‚¬κ°ν˜•μ„ μƒμ†ν•˜μ—¬ μ •μ‚¬κ°ν˜• 객체λ₯Ό λΉ λ₯΄κ²Œ λ§Œλ“€ 수 μžˆμ„ 것이라 생각할 수 μžˆμŠ΅λ‹ˆλ‹€.
그럼 ν•œλ²ˆ μœ„ κ°œλ…μ„ κΈ°μ€€μœΌλ‘œ λ¦¬μŠ€μ½”ν”„ 원칙을 μ€€μˆ˜ν•˜λŠ” μ½”λ“œμ™€ μœ„λ°°ν•˜λŠ” μ½”λ“œλ₯Ό ν•œλ²ˆ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙을 μœ„λ°°ν•˜λŠ” μ½”λ“œ

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.λ§ˆν‹΄


즉, ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” ꡬ체화가 μ•„λ‹ˆλΌ 좔상화에 μ˜μ‘΄ν•΄μ•Ό ν•˜λ©°, κ΅¬ν˜„ 클래슀(κ΅¬ν˜„μ²΄)κ°€ μ•„λ‹ˆλΌ μΈν„°νŽ˜μ΄μŠ€(μ—­ν• )에 μ˜μ‘΄ν•˜λΌλŠ” μ΄μ•ΌκΈ°μž…λ‹ˆλ‹€.

λ§Œμ•½ μžλ™μ°¨κ°€ 타이어에 μ˜μ‘΄ν•˜λ©΄ μ–΄λ–»κ²Œ λ κΉŒμš”? μžλ™μ°¨ νƒ€μ΄μ–΄λŠ” 자주 λ°”λ€Œκ²Œ λ˜λŠ” 것 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€. λ”°λΌμ„œ μ΄λ ‡κ²Œ λ°”λ€ŒλŠ” 것에 μ˜μ‘΄ν•˜λ©΄ μžλ™μ°¨λŠ” 자주 영ν–₯을 λ°›κ²Œ 되게 λ©λ‹ˆλ‹€. 즉, μžλ™μ°¨ μžμ‹ λ³΄λ‹€ 더 자주 λ³€ν•˜λŠ” 타이어에 μ˜μ‘΄ν•˜λŠ” 것은 쒋지 μ•ŠμŒμ„ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ μœ„μ²˜λŸΌ μžλ™μ°¨κ°€ ꡬ체적인 타이어가 μ•„λ‹Œ μΆ”μƒν™”λœ 타이어 μΈν„°νŽ˜μ΄μŠ€μ—λ§Œ μ˜μ‘΄ν•˜κ²Œ ν•¨μœΌλ‘œμ¨ 타이어가 λ³€κ²½λ˜λ”λΌλ„ μžλ™μ°¨κ°€ 영ν–₯을 받지 μ•Šκ²Œ κ΅¬ν˜„ν•¨μœΌλ‘œμ¨ μ˜μ‘΄κ΄€κ³„ μ—­μ „ 원칙을 지킬 수 μžˆμŠ΅λ‹ˆλ‹€.

λŒ“κΈ€