객체지향 설계 5원칙 SOLID (SRP, OCP, LSP, ISP, DIP)

2021. 3. 21. 02:05 JAVA/Java

참조문서

 

1. SOLID란?

객체지향 설계는 긴 세월과 수많은 시행착오를 거치며 5가지 원칙이 정리되었다. 이것은 객체지향 설계의 5원칙이라고 하며, 앞글자를 따서 SOLID라고 한다.

  1. SPR(Single Responsibility Principle) : 단일 책임 원칙
  2. OCP(Open Closed Principle) : 개방 폐쇄 원칙
  3. LSP(Liskov Substitution Principle) : 리스코프 치환 원칙
  4. ISP(Interface Segregation Principle) : 인터페이스 분리 원칙
  5. DIP(Dependency Inversion Principle) : 의존 역전 원칙

이 원칙들은 응집도는 높이고 결합도는 낮추자는 고전 원칙을 객체 지향의 관점에서 재정립한 것으로 볼 수 있다.

2. SRP = 단일 책임 원칙

어떤 클래스를 변경해야 하는 이유는 오직 하나 뿐이어야 한다.

SRP가 안지켜진 사례

  • 변수레벨
    • 하나의 속성이 여러 의미를 갖는 경우
    • 어떤 곳에서는 쓰고, 어떤 곳에선 안쓰는 속성이 있는 경우
  • 메소드레벨
    • 분기처리를 위한 if문이 많을 경우

3. OCP = 개방 폐쇄 원칙

소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하지만 변경에 대해서는 닫혀 있어야 한다. 즉, 자신의 확장에는 열려있고, 주변의 변화에 대해서는 닫혀 있어야 한다는 것이다. 이것은 interface 를 통해 구현하여 해결한다.

현실의 예를들면 상점직원이 아무리 바뀐다고해서 손님이 상품을 구매하는 데는 지장이 없다. 이는 직원은 판매 인터페이스를 구현해야하기 때문이다. 손님은 판매인터페이스와 소통하기 때문에 직원이 누구든 지장이 없다.

4. LSP = 리스코프 치환 원칙

서브타입은 언제나 자신의 기반타입으로 교체할 수 있어야 한다. 즉, 하위 클래스의 인스턴스는 상위형 객체 참조 변수에 대입해 상위 클래스의 인스턴스 역할을 수행하는 데 문제가 없어야 한다. 이것은 OOP 4대 특성의 상속, 인터페이스 원칙이 잘 지켜진 다면 LSP는 자동으로 잘 적용된 것이다. (주로 조직도, 계층도 관점에서의 상속이 LSP를 위배하는 문제가 생긴다)

5. ISP = 인터페이스 분리 원칙

클라이언트는 자신이 사용하지 않는 메소드에 의존 관계를 맺으면 안된다. ISP는 SRP와 비슷하지만 인터페이스를 통한 다른 해결책을 제안하고 있다. 예를들어 class 사람 implements 군인 이면 군인 홍길동 = new 사람() 을 통해 군인 인터페이스의 메소드만을 사용하도록 제한하는 것이다. SRP였다면 class를 나눠버렸겠지만.. 일반적으론 ISP보다 SRP 할 것이 권장된다.

6. DIP = 의존 역전 원칙

고차원 모듈은 저차원 모듈에 의존하면 안된다. 추상화된 것은 구체적인 것에 의존하면 안된다. 구체적인 것이 추상화된 것에 의존해야 한다. 자주 변경되는 클래스에 의존하지 말자. 로 요약될 수 있다. 즉, 자신보다 변하기 쉬운 것에 의존하지 말라는 것이다. 해결방법은 OCP와 비슷한데, 구체적인 class가 아닌, 인터페이스에 의존함으로써 DIP를 해결한다.



출처: https://sjh836.tistory.com/159?category=679845 [빨간색코딩]