Open-Closed Principle (OCP)

1550 단어 OOPOOP

OCP 정의

OCP의 정의는 다음과 같다.

확장에는 열려있어야하고 변경에는 닫혀있어야 한다.

OCP란 용어만 봤을 때 용어의 내용을 외우는 것이 쉬워서 OOP 중에서 제일 쉬운 것이 OCP가 아닐까 라는 단순한 생각을 했었다.

스프링을 공부하기 위해 토비의 스프링에서 DI, IOC 부분을 읽고, 최근에는 김영한님의 스프링 핵심 원리 강의를 들으면서 OCP는 절대 쉽지 않다는 것을 깨닫고 있다.

OCP는 왜 어려울까?

OCP를 좀만 공부하다보면 인터페이스가 등장한다. 자바의 인터페이스는 다형성을 보장해주기 때문에 인터페이스를 통해 추상화시키면 확장에는 열려있고 변경에는 닫혀있을 수 있다는 사실(?)을 조심스럽게 깨닫게 된다.

그런데 뭔가 이상하다. 확장에 열려있다는 것은 인터페이스를 이용하면서 이해가 되는데 변경은 어떻게 닫혀있을 수 있는거지?

Car라는 인터페이스를 구현하여 Car를 상속받은 Kona 클래스와 Sonata 클래스가 있다. Car를 인터페이스로 만들어서 다형성을 만족시켰고 MyGarage에서 Car의 인스턴스를 생성한다.

public class MyGarage {

    private Car myCar = new Sonata();
    
}

위 코드에서 myCar의 인스턴스를 Kona로 변경하려고 한다면?

코드는 당연히 수정되어야 한다.

해결

코드의 수정을 막기 위해서 보통은 외부(ex. IoC 컨테이너)에서 myCar의 인스턴스를 주입해주면 된다. 아마도 스프링을 공부한 사람들은 이 방법에 대해서 알고있을 것이다. 해당 내용은 따로 스프링과 관련된 글을 작성하면서 보충하고자 한다.

좋은 웹페이지 즐겨찾기