해당 내용은 '스프링 입문을 위한 자바 객체 지향의 원리와 이해'와 인프런 김영한님의 '스프링 핵심 원리 - 기본편' 강의를 참고하였습니다.
개방
되어 있는 것이고, 운전자 입장에서는 주변의 변화에 폐쇄
가 되어있는 것이다. 하위 클래스 is a kind of 상위 클래스
- 하위 분류는 상위 분류의 한 종류이다.구현 클래스 is able to 인터페이스
- 구현 클래스는 인터페이스 할 수 있어야 한다. "고차원 모듈은 저차원 모듈에 의존하면 안 된다. 이 두 모듈 모두 다른 추상화된 것에 의존해야 한다."
"추상화된 것은 구체적인 것에 의존하면 안 된다. 구체적인 것이 추상화된 것에 의존해야 한다."
"자주 변경되는 구체(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를 가능하게 지원한다.
이에 대해선 다음에 이야기하도록 하자.