1. SOLID

  1. OOP 설계 5원칙
    1. [SRP - Single Responsiblility Principle(단일 책임 원칙)]
      1. [설명]
        1. 한 클래스는 하나의 책임만 가집니다
        2. 클래스는 그 책임을 완전히 캡슐화해야 합니다
      2. [예시]
        1. 만약 결제 클래스가 있다면 오직 결제 기능만을 책임지는데, 클래스를 수정해야 한다면 결제에 관련된 문제가 발생합니다
    2. [OCP - Open Closed Principle(개방 폐쇄 원칙)]
      1. [설명]
        1. Software의 구성요소(Component, Class, Module, Function)는 확장에는 열려 있어야 하지만 변경에는 폐쇄적이여야 합니다
        2. 기존의 코드를 변경하지 않으면서, 기능을 추가할 수 있도록 설계가 되야함을 말합니다
      2. [예시]
        1. 하나의 유저를 생성하고 각 유저들의 행동이 다를 경우, 행동 패턴 구현을 하위 클래스에 맡긴다면 유저 클래스의 수정은 필요가 없으며 행동패턴만 재정의 하면 됩니다
    3. [LSP - Listov Substitution Priciple(리스코프 치환 원칙)]
      1. [설명]
        1. 상위타입은 항상 하위타입으로 대처될 수 있어야 합니다
        2. 부모 클래스가 들어갈 자리에 자식 클래스를 넣어도 역할을 하는데 문제가 없어야 한다는 의미입니다
        3. 리스코프 치환 원칙을 따르며 리스코프 치환원칙은 다형성과 확장성을 그대화하며, 개방과 폐쇄 원칙을 구성합니다
      2. [예시]
        1.                                          **동물**
          
        2.                              **↗                       ↖**
          
        3.                      **포유류                               조류**
          
        4.                **↗               ↖                 ↗               ↖**       
          
        5.         **고래                       박쥐     참새                    펭귄**
          
    4. [ISP - Interface Segregation Priciple(인터페이스 분리 원칙)]
      1. [설명]
        1. 각 역할에 맞게 인터페이스를 분리하는 것을 말합니다
        2. 인터페이스 내에 메서드는 최소한 일 수 록 좋으며, 최소한의 기능만 제공하면서 하나의 역할에 집중하라는 의미입니
      2. [예시]
        1. ISP 적용 전
          1. User1, User2, User3객체들은 **OPS[ops1, ops2, ops3]**라는 메서드를 상속 받습니다! 이렇게 되면 문제는, 각각의 User객체들이 원하는 기능들이 있는데, 만약 User1에서 OPS메서드 안에 ops1기능만 원하는데, ops2메서드에서 변경이 일어난다면 User1은 ops1만 사용하였음에도 불구하고 User1은 OPS 전체 메서드를 상속 받고 있기에 문제가 발생합니다!
        2. ISP 적용 후
          1. OPS를 상속 받는 **User1Ops[ops1], User2Ops[ops2], User3Ops[ops3]**로 분리를 하고 분리된 메서드를 각 객체들에게서만 사용할 수 있는 구조로 만들면 ops2 메서드에서 변경이 일어나도 User1객체에는 전혀 영향을 주지 않습니다
          2. [적용 예시]
            1. User1
            2. ↓ (상속)
            3. User1Ops(ops1)[Interface]
            4. ↓ (상속)
            5. OPS(ops1,ops2,ops3)[Class]
    5. [DIP - Dependency Inversion Principle(의존 역전 원칙)]
      1. [설명]
        1. 변화하기 쉬운 것 or 자주 변화하는 것보다는 변화하기 어려운 것, 거의 변화가 없는 것에 의존하는 것을 말합니다
        2. 구체적인 클래스보다 상위 클래스, 인터페이스, 추상 클래스와 같이 변하지 않을 가능성이 높은 클래스와 관계를 맺는 것을 말합니다
      2. DIP 적용 전 - 의존관계 역전 원칙을 위배한 것 입니다
        1. Dog
        2. ↓ (상속)
        3. Barking
      3. DIP 적용 후 - 의존관계 역전 원칙 준수한 것 입니다
        1. Dog
        2. ↓ (상속)
        3. Action[Interface]
        4. ↑ (의존)
        5. Bark, Eat, Sleep