[Java] 객체지향 설계 5원칙(SOLID)

rara_kim·2022년 7월 27일
0

Spring

목록 보기
7/20
post-thumbnail

좋은 소트프웨어 설계를 위해서는 결합도(coupling)는 낮추고 응집도(cohesion)는 높여야 한다.

💡결합도

  • 모듈(클래스)간의 상호 의존 정도를 나타내는 지표
  • 결합도가 낮으면 모듈간의 상호 의존성이 줄어들어 객체의 재사용 및 유지보수가 유리하다.

💡응집도

  • 하나의 모듈 내부에 존재하는 구성 요소들의 기능적 관련성
  • 응집도가 높은 모듈은 하나의 책임에 집중하고 독립성이 높아져, 재사용 및 유지보수가 용이하다.

단일 책임 원칙(SRP:Single Responsibility Principle)

어떠한 클래스를 변경해야 하는 이유는 하나뿐이어야 한다.
- 로버트 C.마틴

말그대로 하나의 클래스는 하나의 책임만 가져야 한다.
이러저러한 서로 다른 기능(Method)들을 모아 하나의 클래스에 두게되면 유지보수도 어렵고, 개발시 conflict가 발생하기 쉽다.

개방 폐쇄 원칙(OCP: Open Closed Principle)

  • 소프트웨어 요소는 확장에는 열려있으나, 변경에는 닫혀 있어야 한다.
  • 즉, 기존의 코드를 변경하지 않고 기능을 추가할 수 있도록 설계 해야한다.
  • if else에서 반복적인 케이스가 보이면, 하나의 클래스를 수정하지 말고 추가하는 기능만큼 클래스를 추가하는 것을 고려 해야한다.

상위 클래스 또는 인터페이스를 중간에 둠으로써, 자신은 변화에 대해서는 폐쇄적이지만, 인터페이스는 외부의 변화에 대해서 확장을 개방해 줄 수 있다.
이러한 부분은 JDBC와 Mybatis, Hibernate 등 Java에서는 Stream(Input, Out)에서 찾아볼 수 있다.

JDBC를 개방 폐쇄 원칙의 가장 좋은 예로 들 수 있다.
데이터베이스가 오라클에서 MySQL로 바뀌더라도 Connection을 설정하는 부분만 변경해주면 된다.

즉, 자바 애플리케이션은 데이터베이스라고 하는 주변의 변화에 닫혀있고, 데이터베이스는 자신의 확장에는 열려 있는 것이다.


리스코프 치환 원칙(LSP:Listov Substitution Priciple)

  • 서브 타입은 언제나 자신의 상위 타입으로 교체할 수 있어야 한다.
  • 예를 들어, 자동차를 상속받아 오픈카, SUV등을 만들면 되는데, 헬리콥터 등을 만들게 되면 LSP를 지키지 못한 것이다.
  • 상속받은 클래스는 부모 클래스와 동일한 동작을 해야 재활용 가능성이 높아진다.

하위 클래스 is a kind of 상위 클래스: 하위 분류는 상위 분류의 한 종류이다.
구현 클래스 is able to 인터페이스: 구현 분류는 인터페이스 할 수 있어야 한다.


인터페이스 분리 원칙(ISP:Interface Segregation Principle)

  • 인터페이스도 단일의 책임을 갖도록 설계해야 필요한 기능만 구현하고 제공할 수 있다.
  • 너무 큰 인터페이스를 만들면 빈 메소드를 만드는 경우가 발생한다.
  • 필요한 기능들을 인터페이스로 만들어, 그 인터페이스를 구현한 형태로 코드를 작성하면 SRP에 맞추어 구현할 수 있다.

의존성 역전 원칙(DIP:Dependency Inversion Principle)

  • 자신보다 변하기 쉬운 것에 의존하지 말아야 한다.
  • 하위 모듈의 변경이 상위 모듈의 변경을 요구하는 의존성을 끊어내야 한다.

    위와 같이 사람이 옷에 의존하게 되면 사람은 계절이 바뀔 때마다 영향을 받게 된다.

    사람이 봄 옷, 여름 옷, 가을 옷이 아닌 추상화된 옷이라는 인터페이스에만 의존하게 함으로써 옷이 변경되어도 사람은 영향을 받지 않게 할 수 있다.

profile
느리더라도 꾸준하게

0개의 댓글