본문 바로가기
Java

SOLID 좋은 객체지향 설계의 5가지 원칙

by 쁘니쁘나 2022. 5. 19.

SOLID

클린코드로 유명한 로버트 마틴이라는 사람이 “좋은 객체지향 설계의 5가지 원칙” 이라고 구지 만들어놓음....

 

SRP : 단일 책임 원칙(Single responsibility principle)

하나의 클래스는 하나의 책임만 가져야 한다. 코드 수정을 해야하는데 파급 효과가 적다면?? 단일 책임 원칙을 잘 따른것!

OCP : 개방-폐쇄 원칙(Open/closed principle)

막 뭐라 정의는 못하겠다.. 내가 이해한건 그냥 로미오와 줄리엣 대역!! 로미오가 아프면 대역이 대신할 수 있는게 개방-폐쇄 원칙 지킨거다..! 로미오인 주연에 의존하지말고 대역인 인터페이스를 이용해라 뭐 그런 의미인듯

예를들어 만약에 PM이 이번 기능은 A로 하기로했어 그렇게해! 라고 했는데 내가 보기엔 아무리생각해도 A가 아님. 근데 PM이 말을 듣지않음. 저놈 백퍼 나중에 수정할께 뻔히 보임. 그런경우를 대비해서 new A 이렇게 구현하지말고 인터페이스로 구현을 해놓으면 나중에 B로 바꾸더라도 쉽게 바꿀 수 있음. new A 를 해버리면 그 new A를 사용한 모든 클래스를 B로 바꿔주어야하는 불상사가 생김

Apple member = new Apple(); // 기존코드
Apple member = new Banana() // 변경코드

구현 객체를 변경하려면 그걸 사용하고 있는 클라이언트 코드를 모두 변경해야 한다. 다형성을 사용했는데 OCP 원칙은 지킬수 없게됨!! 그럼 어떻게??
➡️ 객체를 생성하고, 연관을 맺어주는 무언가가 있다 그걸 바로 스프링이 해준다.. 허허 공부해야함.. 스프링 컨테이너라는애가 해준다고 함 (DI, IOC 모 이런용어가 있다고 함)

LSP : 리스코프 치환 원칙(Liskov substitution principle)

그냥 쉽게 말해서 자동차 라는 인터페이스의 엑셀기능은 앞으로 가는 기능이다. 근데 뒤로 가게 구현한다면 LSP 위반!! 기능에 맞게 구현해야함! 뒤로가게 구현해도 컴파일에서 오류가 나지않고 성공이지만 우리가 목표한 기능은 앞으로 가는 엑셀기능이였으므로 느리더라도 앞으로 가게 구현해야 LSP 를 지켰다 할수있다.

ISP : 인터페이스 분리 원칙(Interface segregation principle)

특정 클라이언트를 위한 인터페이스 여러개가 범용 인터페이스 하나보다 낫다. 즉, 기능을 잘 쪼개서 구현하는게 중요하다는 말이다! 예를들어 자동차 인터페이스에는 운전, 정비 인터페이스로 분리해 놓고, 사용자 클라이언트에는 운전자, 정비사 클라이언트로 분리해 놓았을때, 정비 인터페이스 자체가 변해도 운전자 클라이언트에 영향을 주지 않는다. 인터페이스가 명확해지고, 대체 가능성이 높아지는 방법임!

DIP : 의존관계 역전 원칙(Dependency inversion principle)

역할에 의존해야지 구현에 의존하면 절대 안된다는 말이다. (구현 클래스에 의존하지말고, 인터페이스에 의존하라는 의미) 예를들어 비가 김태희랑만 연극을 할수있다하면 김태희가 다른배우로 대체되었다고 할때 제대로 연극을 할 수 없음!! 김태희에 의존하는게 아니라 김태희가 맡은 역할 에 의존해야한다!

 

 

 

* 인프런에서 김영환님의 스프링기본편 강의를 들으며 이해한 내용을 작성한 것입니다 :)

댓글