본문 바로가기

Java

[Java] 객체지향 5원칙 SOILD

 

SOLID

  • SRP(Single Responsiblity Principle) : 단일 책임 원칙
  • OCP(Open Closed Principle) : 개방 폐쇄 원칙
  • LSP(Liskov Subsititution Principle) : 리스코프 치환 원칙
  • ISP(Interface Segregation Principle) : 인터페이스 분리 원칙
  • DIP(Dependency Inversion Principle) : 의존 역전 원칙

응집도를 높이고(High Cohesion), 결합도는 낮추는(Loose Coupling) 객체 지향 프로그래밍 및 설계의 5가지 기본 원칙


SPR - 단일 책임 원칙

 

  • 클래스를 역할과 책임에 따라 분리해 각각 하나의 역할과 책임만 갖게 해야한다.
  • 어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다.

Before


After

 

role에 따라 클래스를 나눔으로써 단일 책임 원칙을 적용


OCP - 개방 폐쇄 원칙

 

  • 자신의 확장에는 열려 있고, 주변의 변화에 대해서는 닫혀 있어야 한다.

OCP 예시

  • 상위 클래스나 인터페이스를 중간에 두어 자바 애플리케이션이 DB 변화에 영향을 받지 않는다.
  • 유연성, 재사용성, 유지보수에 용이

LSP - 리스코프 치환 원칙

 

  • 서브타입은 언제나 자신의 기반(Base) 타입으로 교체할 수 있어야 한다.
  • 하위 클래스의 인스턴스는 상위형 객체 참조 변수에 대입해 상위 클래스의 인스턴스 역할을 하는 데 문제가 없어야 한다.

리스코프 치환 원칙 위반 사례 - 계층도/조직도
리스코프 치환 원칙 적용 사례 - 분류도


ISP - 인터페이스 분리 원칙

 

  • 클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안 된다.
  • 인터페이스를 통해 메서드를 외부에 제공할 때는 최소한의 메서드만 제공(인터페이스 최소주의 원칙)
  • 상위클래스는 풍성할수록 좋고, 인터페이스는 작을 수록 좋다.
  • 특별한 경우가 아니라면 단일 책임 원칙을 적용

다양한 책임을 가진 남자 클래스
단일 책임 원칙을 적용한 남자 클래스, 단일 책임을 가진 여러 클래스로 분리
인터페이스 분할 원칙을 적용한 남자 클래스
빈약한 상위 클래스 VS 풍성한 상위 클래스


DIP - 의존 역전 원칙

 

  • 자주 변경되는 구체 클래스에 의존하지 말아야 한다.
  • 고차원 모듈은 저차원 모듈에 의존하면 안 된다. 이 두 모듈 모두 다른 추상화 된것에 의존해야 한다.
  • 추상화된 것은 구체적인 것에 의존하면 안 된다. 구체적인 것이 추상화된 것에 의존해야 한다.

의존 역전 원칙 적용 전(자주 변경되는 구체 클래스에 의존)

  • 스노우타이어를 일반 타이어로 교체할 때 자동차는 그 영향에 노출
  • 자동차 자신보다 더 자주 변하는 스노우타이어에 의존하기에 부서지기 쉬움

의존 역전 적용 후

  • 자동차가 구체적인 타이어들이 아닌 추상화된 타이어 인터페이스만 의존
  • 다른 구체적인 타이어로 변경돼도 자동차는 영향을 받지 않는다.
  • 자신보다 변하기 쉬운 것에 의존하던 것을 추상화된 인터페이스나 상위 클래스를 두어 변화하기 쉬운 것이 변화에 영향받지 않게 한느 것이 의존 역전 원칙이다.

 

참고 자료

  • 스프링 입문을 위한 자바 객체 지향의 원리와 이해, 위키북스, 김종민(지은이)