객체지향 설계 5원칙 SOLID (SRP, OCP, LSP, ISP, DIP)
참조문서
1. SOLID란?
객체지향 설계는 긴 세월과 수많은 시행착오를 거치며 5가지 원칙이 정리되었다. 이것은 객체지향 설계의 5원칙이라고 하며, 앞글자를 따서 SOLID라고 한다.
- SPR(Single Responsibility Principle) : 단일 책임 원칙
- OCP(Open Closed Principle) : 개방 폐쇄 원칙
- LSP(Liskov Substitution Principle) : 리스코프 치환 원칙
- ISP(Interface Segregation Principle) : 인터페이스 분리 원칙
- 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 [빨간색코딩]
'JAVA > Java' 카테고리의 다른 글
[Java] Java Optional (자바 옵셔널) 정리, 예제모음 (0) | 2021.03.29 |
---|---|
[Java] Java 클래스 로딩 과정(Java Class Loading Process) (0) | 2021.03.29 |
Enum 찾기의 달인 (효율적으로 찾기, spring bean과 맵핑) (0) | 2021.03.21 |
lambda (람다, 표현식, 함수형 인터페이스, default 메소드, 메소드 레퍼런스) (0) | 2021.03.21 |
객체지향의 4대 특성 (클래스, 객체, 인스턴스, 캡슐화, 상속, 추상화, 다형성) (0) | 2021.03.21 |
스레드덤프 (thread dump) (0) | 2021.03.21 |
중첩클래스를 알아보자 (내부클래스, 정적 중첩클래스, 지역클래스, 익명클래스) (0) | 2021.03.21 |
최상위 객체 Object 클래스(주요 메소드, finalize 이슈) (0) | 2021.03.21 |