[Java] SOLID

Posted by 유진 Blog on August 27, 2023

SOLID (객체 지향 설계)

: 객체 지향 프로그래밍 및 설계의 기본 원칙 5가지

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

  • 한 클래스는 하나의 책임만 가져야 한다.
  • 그 책임을 완전히 캡슐화해야 한다.

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

  • 확장에는 열려 있으나, 변경에는 닫혀 있어야 한다.
  • 기존의 코드를 변경하지 않고, 새로운 코드를 추가함으로써 수정이 가능해야 한다.

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

  • 하위 타입 객체는 상위 타입 객체에서 가능한 행위를 수행할 수 있어야 한다.
  • 상속관계에서는 꼭 일반화 관계 (IS-A)가 성립해야한다는 의미 (일관성 있는 관계인지)
  • 상속관계가 아닌 클래스들을 상속관계로 설정하면, 이 원칙이 위배된다. (재사용 목적으로 사용하는 경우) 프로그램의 객체는 프로그램의 정확성을 깨트리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.

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

  • 인터페이스들을 구체적이고 작은 단위들로 분리시켜야한다.
  • 클라이언트가 꼭 필요한 메서드들만 이용할 수 있게 한다.
  • 시스템의 내부 의존성을 약화시켜 리팩토링, 수정, 재배포를 쉽게 할 수 있다.

각 클라이언트가 필요로 하는 인터페이스들을 분리함으로써, 클라이언트가 사용하지 않는 인터페이스에 변경이 발생하더라도 영향을 받지 않도록 만들어야하는 것이 핵심이다.

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

  • 상위 모듈은 하위 모듈에 의존해서는 안된다.
  • 상위 모듈과 하위 모듈 모두 추상화에 의존해야 한다.
  • 추상화는 세부 사항에 의존해서는 안된다. 세부사항이 추상화에 의존해야 한다.
  • 의존성 주입은 이 원칙을 따르는 방법 중 하나이다.
  • 의존관계를 역전시킴으로써 상위 계층이 하위 계층의 구현으로부터 독립되게 할 수 있다.

** SRP와 ISP는 객체가 커지는 것을 막아준다. 객체가 단일 책임을 가지고, 클라이언트마다 특화된 인터페이스를 구현하게 함으로써 한 기능의 변경이 다른 곳까지 미치는 영향을 최소화하고, 이는 기능 추가 및 변경에 용이하도록 한다.

LSP와 DIP는 OCP를 서포트한다. OCP는 자주 변화되는 부분을 추상화하고 다형성을 이용함으로써 기능 확장에는 용이하되 기존 코드의 변화에는 보수적이도록 만들어준다. 변화되는 부 분을 추상화할 수 있도록 도와주는 원칙이 DIP이고, 다형성 구현을 도와주는 원칙이 LSP인 것이다.

참고 : 위키백과 | 블로그