SOLID 원칙
객체지향 설계에서 지켜줘야할 5대 원칙에 대해 정리 해봅니다.
- 틀린 부분이 있을 수 있습니다.
왜 사용하는가?
- 이런 원칙에 따라서 개발을 한다면, 더 유지보수 하기 쉽고 확장이 쉬운 소스코드를 짤 수 있다.
SRP 단일 책임 원칙
클래스와 메소드는 한가지의 일만 한다.
1 |
|
- 다음과 같은경우는,
Champion
이란 클래스는 두개의 책임을 지고 있는것을 볼 수 있다. - 즉 단일 책임 원칙을 어기고 있다.
1 |
|
- 하지만 다음과 같이 바꾼다면,
Champion
클래스에서는 한개의 책임만 지고 있는것을 확인 할 수 있다.
OCP 개방 폐쇄원칙
자신의 확장에는 개방되어 있고, 주변의 변화에는 닫혀 있어야 한다.
- 기능의 확장이나 변경이 필요한 경우, 기존 구성요소는 수정이 일어나지 않아야 한다.
-
기존의 구성요소를 확장 해서 재사용 해야한다.
운전자
가 각각의 차종에 의존되어 있다고 해보자.
1 |
|
1 |
|
K5
,아방이
외 다른 차종이 추가된다면?- 운전자 클래스에서 수정 이 일어나야 한다.
- 변화에 따라서 의존적으로 변할 수 밖에 없는 구조가 된다.
- 하지만
자동차
라는 인터페이스나 클래스를 하나 더 두게 된다면?
1 |
|
1 |
|
- 자동차 클래스는 다른 차종에 대해서 확장하기가 수월해진다.
- 그냥 새로운 클래스만 하나더 만들어주면 된다.
- 그리고 운전자는 K5 외의 차종 추가와 같은 변화에 대해서 의존적이지 않게 된다.
LSP 리스코프 치환 법칙
서브 타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 한다.
- 간단하게 생각하면
IS-A
법칙을 잘 지키면 된다. - 상속은 조직, 계층도가 아닌 분류도가 되어야 한다.
1 |
|
아들은 아빠이다
? 잘못되었다.아들
은 자신의 기반 타입인아빠
로 교체할 수 없게 된다.
1 |
|
레이스는 챔피언이다
자연스럽다- 리스코프 치환 법칙을 잘 지키고 있는것을 볼 수 있다.
ISP 인터페이스 분리 원칙
클라이언트는 자신이 사용하지 않는 메소드에 의존 관계를 맺으면 안된다.
- 만약
정윤성
이라는 클래스가 있다고 해보자. 정윤성
은 여러가지 역할을 지니고 있다.- 친구
- 교육생
- 아들…등등
-
이것 모든 역할을
정윤성
이라는 클래스에 다 때려박는다면, 친구의 역할만 필요한 클라이언트는 아들의 역할을 하는 메소드에도 의존 관계를 맺게 된다. -
그렇다고
SRP
원칙을 지키겠다고, 전부 따로 구현을 한다면 굉장히 많은 클래스를 만들게 될것이다. - 그러면 어떻게 할까?
- 각 역할에 따른 인터페이스를 만들어서 관리해주면 된다.
1 |
|
- 이제 Student 의 역할이 필요한 경우에는 Student로 만들면 된다.
Student studentJYS = new JungYoonSung();
- 이렇게 만들어진 studentJYS는 사용하지 않는 메소드인
play
메소드에 의존적이지 않게 된다.
- Person에는 공통된 기능을 하는 메소드
eat
,sleep
를 구현해 두었다.- 상위 클래스가 풍부할수록 재활용성이 늘어나 소스코드가 깔끔해진다.
DIP 의존성 역전 법칙
자기보다 변하기 쉬운 것에 의존 하지마라.
- 구체적인 것보다 추상적인것에 의존하는것이 좋다.
- 관계를 느슨하게 만들어 두는것이 좋다.
- 자동차가
스노우 타이어
에 의존하고 있다고 해보자.스노우 타이어
는 계절이 바뀌면 사용하지 않는다.- 굉장히 변하기 쉬운 객체인 것이다.
- 자동차가
타이어
인터페이스에 의존하고 있다고 해보자.- 의존 관계를
타이어
인터페이스를 통해서 역전 시킨다. 타이어
는스노우 타이어
보다 추상적 이게 된다.- 만약
스노우 타이어
에서일반 타이어
로 바뀌더라도, 자동차 객체에는 영향을 미치지 않게 한다.
- 의존 관계를
Reference
- http://www.nextree.co.kr/p6960/
- https://lktprogrammer.tistory.com/38
- https://sehun-kim.github.io/sehun/solid/
- https://woovictory.github.io/2019/05/10/What-is-SOLID/