🌱 오늘의 주제 : 객체 지향 설계 5원칙 - SOLID
🌱 SOLID
- SRP(single responsibility principle) : 단일 책임 원칙
- OCP(open closed principle) : 개방 폐쇄 원칙
- LSP(liskov substitution principle) : 리스코프 치환 원칙
- ISP(interface segregation principle) : 인터페이스 분리 원칙
- DIP(dependency inversion principle) : 의존 역전 원칙
🌱 SRP - 단일 책임 원칙
- " 어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다." - 로버트 C.마틴
- 단일 책임 원칙은 역할(책임)을 분리하는 것이다. (클래스, 속성, 메서드, 패키지, 모듈, 컴포넌트, 프레임워크)
- 테이블을 설계할 때도 단일 책임 원칙을 고려해야 한다.
🌱 OCP - 개방 폐쇄 원칙
- "소프트웨어 엔티티(클래스, 모듈, 함수) 는 확장에 대해서는 열려 있어야 하지만 변경에 대해서는 닫혀 있어야 한다. - 로버트 C.마틴
- 예를 들어, 데이터베이스 프로그래밍에서 오라클을 사용하다가 MySQL로 바뀌더라고 Connection을 설정하는 부분 외에는 따로 수정할 필요가 없다. Connection 설정 부분을 별도의 설정 파일로 분리해두면 클라이언트 코드는 단 한줄도 변경할 필요가 없다.
- 개방 폐쇄 원칙을 무시하고 프로그램을 작성하면 객체 지향 프로그램의 가장 큰 장점인 유연성, 재사용성, 유지보수성 등을 얻을 수 없다. 따라서 객체 지향 프로그래밍에서는 반드시 지켜야 한다.
🌱LSP - 르스코프 치환 원칙
- "서브 타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 한다." - 로버트 C. 마틴
- 하위 클래스 is a kind of 상위 클래스 - 하위 분류는 상위 분류의 한 종류다.
- 구현 클래스 is able to 인터페이스 - 구현 분류는 인터페이스 할 수 있어야 한다.
- 상속은 조직도나 계층도가 아닌 분류도가 돼어야 한다. 예를 들어, 아버지 - 딸 구조(계층도/ 조직도)는 리스코프 치환 원칙을 위배하고 있는 것이고, 동물- 펭귄 구조(분류도)는 리스코프 치환 원칙을 만족하고 있는 것이다.
🌱 ISP - 인터페이스 분리 원칙
- "클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안된다." - 로버트 C.마팅
- ISP는 인터페이스 분활 원칙이다. 즉, 인터페이스 최소주의 원칙이다. 인터페이스를 통해 메서드를 외부에 제공할 때는 최소한의 메서드만 제공하라는 것 이다. 상위 클래스는 풍성할 수록 좋고, 인터페이스는 작을수록 좋다는 것이다.
🌱 DIP - 의존 역전 원칙
- "고차원 모듈은 저차원 모듈에 의존하면 안된다. 이 두 모듈 모두 다른 추상화된 것에 의존해야 한다."
- "추상화 된것은 구체적인 것에 의존하면 안된다. 구체적인 것이 추상화된 것에 의존해야 한다."
- "자주 변경되는 구체클래스에 의존하지 마라" - 로버트 C.마틴
- 의존 역전 원칙은 자신보다 변하기 쉬운 것에 의존하던 것을 추상화된 인터페이스나 상위 클래스를 두어 변하기 쉬운 것의 변화에 영향받지 않게 하는 것이다.
🌱 느낀점
객체지향을 그동안 공부하면서, 나무 한 그루씩 봤다면, 이번 chapter를 통해서 좀 더 멀리서 숲을 볼 수 있는 눈이 생긴 것 같다. 가장 인상 깊었던 부분은 SPR - 단일 책임 원칙에서 남자친구의 역할을 여자친구, 어머니, 직장상사, 소대장 등 별로 분류하여 역할을 배분한 부분이 이해가 한눈에 쏙 되고 재밌었다. 사실 코드를 보면 클래스들이 대부분 각자의 역할이 있고 다 다르다는 것은 알고 있었으나, 이렇게 SOLID의 SPR 중에 하나의 이유였다는 부분을 알게 되었다. 또한 마지막 부분에 저자가 객체 지향 관련된 책을 추천해 줬는데, 나중에 꼭 읽어보고 싶다.
'Spring > Book - 스프링 입문을 위한 자바 객체 지향의 원리와 이해' 카테고리의 다른 글
07. 스프링 삼각형과 설정 정보 (1) (0) | 2023.04.14 |
---|---|
06. 스프링이 사랑한 디자인 패턴 (0) | 2023.04.07 |
04. 자바가 확장한 객체 지향 (2) (0) | 2023.03.24 |
04. 자바가 확장한 객체 지향 (1) (0) | 2023.03.17 |
03. 다형성: 사용편의성 (0) | 2023.03.16 |