객체 지향 설계 원칙인 SOLID 원칙에 대해서 설명해주세요. 예시를 들어주세요.
- SOLID 원칙에 대해서 설명해보겠습니다.
- S는 Single Responsible principle 입니다.
- 단일 책임 원칙을 의미하는 데요, 말 그대로 이 클래스가 단 1개의 책임만을 가지게끔 설계 해야 한다는 의미 입니다.
- 예시
- 만약에 주문 서비스를 만든다고 가정합니다.
주문 클래스에서 주문과 관련된 처리가 있어야 하는데, 배송과 관련된 메서드들이 있으면 , 단일 책임 원칙을 위반한다고 볼수 있습니다. 따라서 이런 경우 다른 클래스로 만들어주는 것이 좋습니다.
또 다른 예시로 엔티티 역할을 하면서, 데이터 베이스 관리의 역할도 하는 클래스는 이 원칙을 위반한다고 볼수 있습니다.
- O는 Open Close Principle 입니다.
- 이것은 확장에는 열려있고, 기존 코드의 수정에는 닫혀있도록 설계하라는 원칙입니다.
- 예시
- 주문 서비스에서 결제를 할수 있었는데, 기존의 결제 방식은 체크카드랑 삼성페이만 되었다고 봅시다. 그런데 카카오페이도 되게 끔 해야한다는 요구 사항이 있습니다
이 요구사항과 OCP를 만족하게 끔 설계하려면 어떻게 해야 할까요? 그것은 결제 관련된 인터페이스, 그리고 그것을 구현하는 체크카드, 삼성페이 클래스를 구현해놓고서, 나중에 요구사항이 추가 되면, 결제 인터페이스를 구현하는 카카오페이 클래스를 구현하면 할수 있습니다.
- L은 리스코프 치환 원칙입니다.
- 리스코프 치환원칙은 상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야한다 라는 법칙입니다.
- 예시
- 정사각형과 직사각형을 예시로 들수 있습니다. 직사각형 객체를 상속받아서 정사각형 객체를 만드는 상황이 리스코프 치환원칙을 무시한다고 볼수 있습니다.
직사각형 클래스의 높이를 수정하는 메서드의 명세는 높이만 수정해야하는 것입니다. 그렇지만, 정사각형의 높이 메서드는 높이 수정시 폭도 수정하게 됩니다. 따라서 이러한 모순이 발생하여 적절한 치환이
- I 은
- Interface Segregation Principle 입니다.
- 이것은 인터페이스를 세분화하여 구성하라 는 원칙입니다.
- 예를 들면 마실것을 서비스하는 코드에서 마실것이라는 인터페이스를 구현했다고 가정 합니다.
- 이 마실것은 가격을 반환하는 메서드와 makeDrink를 추상메서드로 가지고 있죠.
- 그래서 이 마실것과 관련된 아메리카노, 카페라떼, 오렌지 주스, 콜라, 사이다 클래스를 만들고 마실것을 구현하도록 하였습니다.
- 그런데, 아메리카노랑 카페라떼는 시럽을 추가하는 메서드를 넣고 싶습니다. 만약 마실것 클래스에 시럽 추가 메서드를 넣는 다면 오렌지 주스, 콜라 사이다 에서는 강제로 구현해야하는 문제가 있죠. 따라서 이러할 겨우는 커피라는 인터페이스를 만들고, 아메리카노와 카페라떼가 해당 인터페이스를 구현하도록 취하면 됩니다.
- D는 dependency inversion principle 입니다.
- 의존성 역전 법칙이죠.
- 예시
- 이것은 상위 클래스가 하위클래스에 의존적이지 않아야 한다는 원칙입니다. 이렇지 않게 하려면 어떻게 해야 할까요? 인터페이스에 의존적이도록 하면 됩니다.
예를 들면, 기존의 결제 서비스가 결제 클릭시, 컨트롤러를 타고 서비스클래스에서 삼성페이 클래스를 직접 호출한다고 한다면, 이를 바꿀때 결제 인터페이스를 만들고, 서비스 클래스에서는 전달받은 인스턴스를 결제 참조변수로 받아서 처리하면, 인터페이스에 의존적이게 할수 있습니다.
참고자료
모든 개발자가 알아야만 하는 SOLID 원칙 - 1편 | Doublem.org
모든 개발자가 알아야만 하는 SOLID 원칙 - 2편 | Doublem.org
[SOLID] 리스코프 치환 원칙(LSP)이란?