개방 폐쇄 원칙 (OCP)
19 Mar 2022소프트웨어 개체(클래스, 모듈, 함수)는 확장에 열려 있어야하고, 수정에 닫혀 있어야 한다.
OCP가 잘 적용된다면, 이미 제대로 동작하는 원래 코드를 변경하는 것이 아니라 새로운 코드를 덧붙임으로써 나중에 그런 변경을 할 수 있게 된다.
해결책은 추상화다
모듈은 추상화를 조작할 수 있다. 이런 모듈은 고정된 추상화에 의존하기 때문에 수정에 대해 닫혀 있을 수 있다. 그 모듈의 행위는 추상화의 새 파생 클래스들을 만듦으로써 확장이 가능하다.
- OCP를 따르지 않는 예제
![]() |
|---|
| 그림1 |
- OCP를 따르는 예제
![]() |
|---|
| 그림2. 스트레티지 패턴, Client는 개방 폐쇄 원칙을 따른다 |
AbstractServer가 아닌 ClientInterface로 이름을 지은 이유:
추상 클래스는 자신을 구현하는 클래스 보다도 클라이언트에 더 밀접하게 관련되어 있기 때문이다.
![]() |
|---|
| 그림3. 탬플릿 메소드 패턴, 기반 크래스는 개방 폐쇄 원칙을 따른다 |
그림3은 대안이 되는 구조를 보여 준다. Policy 클래스는 어떤 종류의 정책을 구현하는 구체적인 공용 함수들을 갖는데, 그림2에서 본 client의 함수 들과 비슷한 것이다. 이 정책 함수들은 어떤 추상 인터페이스의 형식을 통해 작업하려는 일을 설명한다. 그러나 이번에는 추상 인터페이스가 Policy클래스 자체의 한 부분이다. 자바의 경우 추상 메소드일 것이다. 이런 함수들은 Policy 서브 타입에서 구현된다. 따라서 Policy 내부에 명시된 행위는 Policy클래스의 새로운 파생클래스를 생성함으로써 확장되거나 수정될 수 있다.


