객체 지향 설계의 5대 원칙(SOLID)

namkun·2022년 3월 1일
0

Spring

목록 보기
2/18

해당 내용은 '스프링 입문을 위한 자바 객체 지향의 원리와 이해'와 인프런 김영한님의 '스프링 핵심 원리 - 기본편' 강의를 참고하였습니다.


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

  • 한 클래스는 하나의 책임만 가져야 한다.
  • 즉, 하나의 클래스에 변경이 있는데 그 사이드 이펙트가 적으면 단일 책임 원칙을 잘 따른 것이라고 할 수 있다.

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

  • 소프트웨어 요소는 확장에는 열려있어야 하나, 변경에는 닫혀 있어야 한다.
  • 즉, 기능을 변경하거나 확장할 수 있으면서 그 기능을 사용하는 코드는 수정하지 않는다.
  • 예를 들어서 운전자와 자동차를 생각해보자.
  • 여기서 자동차는 인터페이스이며 이를 상속받아서 구현한 아반떼, 소나타, 그랜져 클래스가 있다.
  • 이렇게 자동자 인터페이스를 사용자와 여러 자동차 사이에 둠으로써 다양한 자동차가 생긴다고 해도 운전자는 운전 습관에 영향을 받지 않는다.
  • 다양한 자동차가 생긴다고 하는 것은 자동차 입장에서는 자신의 확장에는 개방되어 있는 것이고, 운전자 입장에서는 주변의 변화에 폐쇄가 되어있는 것이다.

LSP - 리스코프 치환 원칙 (Liskov Substitution Principle)

  • 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
  • 하위 클래스 is a kind of 상위 클래스 - 하위 분류는 상위 분류의 한 종류이다.
  • 구현 클래스 is able to 인터페이스 - 구현 클래스는 인터페이스 할 수 있어야 한다.
  • 자동차의 인터페이스중 브레이크는 멈추라는 기능인데, 만일 예를 들어 아반떼 라는 구현 클래스에서 브레이크는 앞으로 가는 기능이라면 해당 아반떼 구현 클래스는 LSP를 위배한 것이다.

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

  • 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
  • 컴퓨터 인터페이스 -> 노트북, 데스크탑 인터페이스로 분리
  • 사용자 클라이언트 -> 일반 사용자, 전문 사용자 인터페이스로 분리
  • 너무 범용으로 쓰지말고 적당하게 쪼개자

DIP - 의존관계 역전 원칙 (Dependency Inversion Principle)

"고차원 모듈은 저차원 모듈에 의존하면 안 된다. 이 두 모듈 모두 다른 추상화된 것에 의존해야 한다."

"추상화된 것은 구체적인 것에 의존하면 안 된다. 구체적인 것이 추상화된 것에 의존해야 한다."

"자주 변경되는 구체(Concrete) 클래스에 의존하지 말라."

- 로버트 C 바인

  • 쉽게 말해서 구현 클래스에 의존하지 말고, 인터페이스에 의존하라는 것
  • 자신 보다 변하기 쉬운 것에 의존하지 말라는 것.

객체 지향 설계 원칙의 함정?

자바의 객체지향 원칙중에 다형성 이라는 것이 있다.

그러나 이 다형성만으로는 객체 지향 설계 원칙중 OCP, DIP 를 가능하게 할 수 없다.

예를 들어서 다형성을 이용한 아래의 코드를 보자.

Car 클라이언트가 구현 클래스를 선택한다.

public class Car{
   //private CarFuelTank fuelTank = new GasolineOil(); // 기존
	private CarFuelTank fuelTank = new ElectricBattery(); // 변경 
}

위의 코드에서 구현 객체를 변경하려면 클라이언트 코드를 변경해야한다. (Gasoline -> ElectricBattery)

그렇기에 이는 OCP 원칙을 위반하는 코드라고 할 수 있다.

또한 위의 코드에서 Car 는 CarFuelTank 인터페이스에 의존하는 것 뿐아니라, ElectricBattrey도 동시에 의존하고 있다.

즉, Car 클라이언트는 구현 클래스를 직접 선택(의존)하고 있다고 할 수 있다.

이는 구체화 클래스에 의존하지 말라는 DIP에도 위반된다고 할 수 있다.

스프링에서는 DI(Dependency Injection)으로 다형성 + OCP, DIP를 가능하게 지원한다.

이에 대해선 다음에 이야기하도록 하자.

profile
개발하는 중국학과 사람

0개의 댓글