이번 글은 SOLID 원칙에 대해 적어 보겠습니다.
제가 이해한 내용이 맞지 않다면 피드백 부탁드립니다.
SOLID 란 무슨 단어 일까?
객체지향 프로그래밍에서의 5대 설계 원칙이 있습니다.
단어 부터 살펴보겠습니다.
- SRP ( 단일 책임 원칙 : Single Responsibility Principle )
- OCP ( 개방 폐쇄 원칙 : Open Close Principle )
- LSP ( 리스코브 치환 원칙 : The Liskov Substitution Principle )
- ISP ( 인터페이스 분리 원칙 : Interface Segregation Principle )
- DIP ( 의존성 역전 원칙 : Dependency Inversion Principle )
위의 5가지로 정의 되어 있습니다..
순서대로 개념을 적어보겠습니다.
단일 책임 원칙
단일 책임 원칙은 말그대로 하나의 책임만 가져라!! 라고 해석 할 수 있는데 아직까지는 이해가 안갑니다.
다이어그램을 보면 좀더 이해가 가실겁니다.
포스기 서비스의 기능들을 모아놨는데 여기서 서비스의 책임은 메뉴 추가, 삭제, 수정, 검색만 가져야하는데 출력이라는 책임도 있습니다.
그러면 이 서비스의 책임은 2개이므로 단일 책임 원칙을 위반하였겠죠?????
방안 방법은 이러합니다.
새로운 책임을 만들어 부여한다. 즉, 새로운 클래스를 만들어 출력이라는 기능을 만든다는 것이죠.
이렇듯 하나의 클래스의 하나의 책임을 가지는 원칙이 단일 책임 원칙이라고 알 수 있습니다.
개방 폐쇄 원칙
개방 폐쇄 원칙이란 무슨 말일까요?? 구글링을 해보면
확장은 개방 되어 있고 수정은 닫혀 있다.
라고 나오는데 이 원칙도 이해가 안갑니다.
자 그러면 그림을 예시를 들어볼까요.
부서의 확장에는 열려있고, 팀들의 기능 수정에는 부서나 제조업에 변화가 없다는 걸 알 수 있습니다.
왜 수정에는 변화가 없을까??
인터페이스 즉 추상화를 통해서 기능을 만들고 팀들이 이 인터페이스를 구현하기 때문에 기능들을 오버라이드합니다.
이전 다형성의 글을 읽어보면 이 원칙에 다형성도 관련이 있다는 것을 알 수 있습니다.
리스코프 치환 원칙
자식 타입을 언제나 부모 타입으로 변경을 해도 프로그램이 정상 동작한다는 원칙입니다.
즉, 업캐스팅을 하라!! 라는 말입니다.
예시를 봅시다.
운전하는 기능을 가진 부모 클래스와 이를 상속 받은 자식 클래스 2개가 있습니다.
업캐스팅을 하여 기능을 실행하는 코드입니다. 실행시 정상 작동이 됩니다.
여기서 리스코프 치환 원칙은 OCP 개방폐쇄 원칙과 관련이 있고 다형성과 관련이 있다는 것을 알 수 있습니다.
인터페이스 분리 원칙
단일 책임 원칙으로 해당 인터페이스에 관련이 있는 기능들로 분리시키고 하나의 책임만 가지게 하자!!
앞서 단일 책임 원칙과, 개방폐쇄 원칙, 리스코프 치환 원칙의 기반이 된 원칙이 인터페이스 분리 원칙입니다.
밝기조절, 블루투스, 방수 기능을 가진 제품 인터페이스가 있습니다.
제품 인터페이스를 구현한 A제품을 만들었다고 가정해봅시다. 그러면 모든 기능들의 책임을 가지고 있을 겁니다.
그런데 A제품에는 방수기능이 없는 제품이라면 방수기능의 책임을 가지고 있을 필요가 있을까요???
위의 코드를 보면 방수기능이 없는 제품인데 방수기능의 책임을 가지게 된 것을 볼 수 있습니다.
이럴때 적절하게 인터페이스를 분리를 시켜 책임과 역할을 나누어준다는 원칙입니다.
인테페이스를 분리시켜 B제품에 방수기능 추가된 다이어그램입니다.
의존 역전 원칙
자신보다 변하기 쉬운 것에는 의존하지마라!! 추상화된 객체를 의존하라!! 는 원칙입니다.
예시를 보면서 이해해 볼까요?
먼저 사람이 연필을 사용한다고 가정해보자.
연필은 필기구로 바꾸기 쉽다. 그래서 이 가정은 의존 역전 원칙에 위반이 됩니다.
원칙을 지키며 설계를 하면 사람은 필기구를 사용한다. 필기구에는 연필, 볼펜, 형광펜이 있다. 라고 설계를 해야합니다.
'Laguage' 카테고리의 다른 글
[JAVA] JVM 구조 (0) | 2022.02.11 |
---|---|
[JAVA] 스레드 ( Thread ) (1) | 2022.02.08 |
[JAVA] Optional (0) | 2022.01.20 |
[JAVA] @애노테이션 ( Annotation ) (0) | 2021.12.28 |
[JAVA] 열거형 ( enums ) (0) | 2021.12.28 |
[java] 객체지향 프로그래밍 설계 원칙 - 결합도 / 응집도 (0) | 2021.12.09 |
Java DTO 관련 정리... (0) | 2021.11.21 |
[java] 객체지향의 특징 개념부터!! (0) | 2021.10.31 |