상세 컨텐츠

본문 제목

SOLID 원칙

보안/java

by MustThanks 2023. 4. 4. 17:45

본문

반응형

SOLID 원칙

* SRP(Single Responsibility Principle) - 단일 책임의 원칙
  객체는 단 하나의 책임만 가져야 한다는 원칙
    - 응집도는 높게
    - 결합도는 낮게 설게

       응집도 : 객체가 얼마나 관련 높은 책임이 할당 되었는가
                  변경이 발생했을 때 어플리케이션내에서 변경이 발생하는 정도
                  특정 기능에 대한 변경이 있을 때 대해 하나의 모듈만 변경된다면 응집도가 높고
                    다수의 모듈이 함께 변경되면 응집도가 낮음

       결합도 : 객체가 협력에 필요한 적절한 수준의 관계만 유지하고 있는지
                   하나의 모듈에서 변경이 발생했을 때 다른 모듈의 변경을 요구하는 정도를 의미
                   하나의 모듈을 수정했을 때 함께 변경해야하는 모듈의 수가 많을수록 결합도가 높음

   
   SRP는 높은 응집도롸 낮은 결합도가 중요


* OCP(Open-Closed Principle) - 개방 폐쇄의 원칙
  기존의 코드를 변경하지 않으면서( Closed ) 기능을 추가할 수 있도록(Open) 설계
  확장에대해서는 개방적이고 수정에 대해서는 폐쇄적
   
  OCP는 캡슐화와 인터페이스 정의를 이용

  
  Adapter,Proxy,Decorator,Strategy,Template : OCP
  Proxy,Decorator,Template,Factory Method,Strategy,Template : DIP



* LSP(Liskov Substitution Principle) - 리스코프 치환 원칙
  자식 클래스는 최소한 자신의 부모 클래스에서 가능한 행위는 수행할 수 있어야 한다는 설계
   자식 클래스는 언제난 부모 클래스의 역할을 대체 할 수 있어야 하며 이것은 부모 클래스와 자식 클래스의 행위가 일관됨을 의미
   자식 클래스가 부모 클래스를 대체 하려면 override 하지 않아야 합니다.
   LSP의 원칙을 따르면 override는 가급사용하지 않는 것이 좋음
           
   서브 타입은 언제나 기반타입으로 교체할 수 있어야 한다
    - 기반 타입이 약속한 규약(Public 인터페이스, 메소드가 처리하는 예외 등의 모든 것)을 지켜야 한다

   LSP원리는 서브 클래스가 확장에 대한 인터페이스를 준수함을 의미
   생성 시점에서 구체 클래스를 노출 시키는 것을 원하지 않을 경우 생성 부분을 Abstract Factory 등의 패턴을 사용하여 유연성을 높임

   LSP는 OCP를 구성하는 구조이며 규약을 준수하는 상속 구조를 제공


* ISP(Interface Segregation Principle) - 인터페이스 분리 원칙
  자신이 사용하지 않는 인터페이스는 구현하지 않는다는 설계
   하나의 거대한 인터페이스 보다는 여러개의 구체적인 인터페이스 가 좋음
    SRP는 객체의 단일 책임의 원칙이며 ISP는 인터페이스의 단일 책임원칙

  클래스가 다른 클래스에 종속될 때는 가능한 최소한의 인터페이스만을 사용

   적용방법
      클래스 인터페이스를 통한 분리 : 클래스의 상속을 이용하여 인터페이스를 나눌 수 있음
      객체 인터페이스를 통한 분리 : 위임(Delegation)을 이용하여 인터페이스를 나눌 수 있음(특정 일의 책임을 다른 클래스나 메소드에게 위임)
                                            다른 클래스의 기능을 사용해야 하지만 그 기능을 변경하고 싶지 않으면 상속 대신 위임을 사용


* DIP(Dependency Inversion Principle) - 의존 역전 원칙
   객체들이 서로 정보를 주고 받을 때 의존 관계가 형성되는데 이 때 객체들은 추상성이 낮은 클래스 보다 추상성이 높은 클래스와 의존 관계를 맺어야 한다는 설계
    인터페이스를 이용하면 DIP원칙을 준수하기 편하다
    DIP는 'IOC' , 훅 메소드, 확장성 이 키워드이며 이 세가지 요소가 조합되어 복잡한 컴포넌트들의 관계를 단순화 하고 컴포넌트 간의 커뮤니케이션을 효율적으로 할 수 있게한다
    
    훅 메소드 : super class에서 default 로 기능을 정의해 두거나 인터페이스를 정의해 놓고 , sub class에서 선택적으로 오버라이드 할 수 있도록 만들어둔 메소드를 hook 메소드라 한다

     DIP는 복잡한 컴포넌트 간의 커뮤니케이션 관계를 단순화 하기 위한 설계 이다
   

관련글 더보기

댓글 영역