Spring

객체지향의 설계, SOLID 원칙

Karla Ko 2023. 9. 13. 19:43
728x90

 

1. 단일 책임 원칙

  • SRP(Single Responsibility Principle)
  • 객체는 단 하나의 책임만 가져야 한다
  • 하나의 클래스는 하나의 기능 담당하여 하나의 책임을 수행하는데 집중되도록 클래스를 따로따로 여러개 설계하라는 원칙
  • 만일 하나의 클래스에 기능(책임)이 여러개 있다면 기능 변경(수정) 이 일어났을때 수정해야할 코드가 많아짐
  • 최종적으로 단일 책임 원칙의 목적은 프로그램의 유지보수성을 높이기 위한 설계 기법



남자가 클래스 고장나면 모든 기능 사용 불가능
클래스를 나눠 놓는다면 남자친구 클래스가 고장나도 아들, 사원, 소대원과 같은 나머지 기능 사용 가능

2. 개방 폐쇄 원칙

  • OCP(Open Closed Priciple)
  • 확장에 열려있어야 하며, 수정에는 닫혀있어야 한다
  • 기능 추가 요청이 오면 클래스를 확장을 통해 손쉽게 구현하면서, 확장에 따른 클래스 수정은 최소화 하도록 프로그램을 작성해야 하는 설계 기법
    • 확장에 열려있다 : 새로운 변경 사항이 발생했을 때 유연하게 코드를 추가함으로써 큰 힘을 들이지 않고 애플리케이션의 기능을 확장할 수 있음
    • 수정에 닫혀있다 : 새로운 변경 사항이 발생했을 때 객체를 직접적으로 수정을 제한함
  • 추상화 사용을 통한 관계 구축을 권장을 의미, 다형성과 확장
  • 유연성, 재사용성, 유지보수성

직원이 바뀐다고 해서 손님이 구매라는 행위를 하는데는 영향이 없음
또한 직원이 여자, 남자, 어른, 아이, 사장, 매니저, 알바라고 해서 손님이 구매하는 행위는 영향을 받지 않음
직원교대에는 손님의 구매행위는 영향을 받지 않는 것이고, 직원은 교대라고 하는 확장에 열려있음
또한 교대 이외에도 구매 담당자의 행위를 추가하거나, 보안 담당자의 행위를 추가하는 확장에 대해 직원은 열려있음

DB 의 확장에는 열려있고, JDBC 인터페이스의 변화는 닫혀있다.

 

3. 리스코프 치환 원칙

  • LSP(Listov Substitution Priciple)
  • 서브 타입은 언제나 기반(부모) 타입으로 교체할 수 있어야 한다는 원칙
  • 다형성의 특징을 이용하기 위해 상위 클래스 타입으로 객체를 선언하여 하위 클래스의 인스턴스를 받으면, 업캐스팅된 상태에서 부모의 메서드를 사용해도 동작이 의도대 흘러가야 하는 것을 의미
    • 하위클래스 is a kind of 상위클래스 - 하위 분류는 상위 분류의 한 종류다.
    • 구현 클래스 is able to 인터페이스 - 구현 분류는 인터페이스 할 수 있어야 한다.

 

아버지 춘향이 = new 딸() ;
이라고 한다면 딸을 하나 낳아서 이름을 춘향이라고 지은것까진 괜찮지만 아버지의 역할을 맡기고 있으므로 불가

계층도/조직도는 리스코프 치환 원칙을 위반한 사례

동물 뽀로로 = new  펭귄(); 
펭귄의 이름을 뽀로로라 하고 동물의 역할을 맡기고 있기때문에 가능

분류도는 리스코프 치환 원칙을 적용한 사례
자바에선 대표적으로 Collection 인터페이스를 LSP의 예로 들 수 있음 

Collection 타입의 객체에서 자료형을 LinkedList에서 전혀 다른 자료형 HashSet으로 바꿔도 add() 메서드를 실행하는데 있어 원래 의도대로 작동되기 때문
다형성 이용을 위해 부모 타입으로 메서드를 실행해도 의도대로 실행되도록 구성을 해줘야 하는 원칙

 

4. 인터페이스 분리 원칙

  • ISP(Interface Segregation Principle)
  • 인터페이스를 각각 사용에 맞게 끔 잘게 분리해야한다는 설계 원칙
  • SRP 원칙이 클래스의 단일 책임을 강조한다면, ISP는 인터페이스의 단일 책임을 강조
  • SRP 원칙의 목표는 클래스 분리를 통하여 이루어진다면, ISP 원칙은 인터페이스 분리를 통해 설계하는 원칙

 

5. 의존 역전 원칙

  • DIP(Dependency Inversion Principle)
  •  어떤 Class를 참조해서 사용해야하는 상황이 생긴다면, 그 Class를 직접 참조하는 것이 아니라  대상의 상위 요소(추상 클래스 or 인터페이스)로 참조하라는 원칙
  • 구현 클래스에 의존하지 말고, 인터페이스에 의존하라는 뜻
  • 의존 관계를 맺을 때 변화하기 쉬운 것 또는 자주 변화하는 것보다는, 변화하기 어려운 것 거의 변화가 없는 것에 의존하라는 것
  • 의존 역전 원칙의 지향점은 각 클래스간의 결합도(coupling)을 낮추는 것

 

자동차가 구체적인 타이어들(스노우, 일반, 광폭)이 아닌 추상화된 타이어 인터페이스에만 의존
스노우타이어에서 일반타이어로 또는 다른 구체적인 타이어로 변경되도 자동차는 이제 그 영향을 받지 않는 형태로 구성

 

 


 

728x90