![](https://velog.velcdn.com/images/jxxn_a/post/e08e0217-647c-41a0-93fb-1cae7897dc1b/image.png)
OCP (Open Closed Principle) - 개방폐쇄의원칙
- 개방폐쇄의 원칙을 의미하며, 소프트웨어의 요소들은 확장에는 열려있어야하고, 변경에는 닫혀있어야한다.
- 기능이 확장 될 때 기존에 작성된 코드는 변경되지 않아야한다.
- 객체지향 프로그래밍의 특징 중 '추상화', '상속', '다형성'에 해당되는 것 같다.
- (예시) 캐릭터 하나를 생성한다고 할 때, 각 캐릭터들의 움직임이 다를 경우 움직임의 패턴 구현을 하위 클래스에 맡기면 캐릭터의 수정은 필요가 없고(close), 움직임의 패턴만 재정의하면 된다.(open)
💫 OCP 구조
![](https://velog.velcdn.com/images/jxxn_a/post/92d8f1ff-8730-4ca8-83da-8c85453d1a44/image.png)
- FileByteSource는 파일에서 Byte를 읽어오는 역할을 하는 클래스
- SocketByteSource는 소켓에서 Byte를 읽어오는 역할을 하는 클래스
=> ByteSource를 구현하는 FileByteSource와 SocketByteSource는 ByteSource를 상속받고, 다형성에 의해 ByteSource 객체의 참조값을 저장할 수 있는 변수에는 ByteSource의 하위타입까지 담을 수 있다.
💫 OCP 구조에서 기능 추가
![](https://velog.velcdn.com/images/jxxn_a/post/c8ae7c2a-7cbd-4de7-a3cf-170c80cc3a32/image.png)
- MemoryByteSource 클래스 내에서는 ByteSource의 메서드를 반드시 재정의해야하고, FileByteSource 혹은 SocketByteSource 와는 다르게 메모리에서 ByteSource를 읽어오도록 만들 수 있다.
- 또한, ByteSource를 사용하는 곳에서는 ByteSource로 추상화되어 있기 때문에 이를 하위 타입으로 강제 캐스팅하지 않았던 이상 기존 코드는 변경하지 않아도 동작시킬 수 있다.
💗 OCP를 지키는 핵심 개념
1) 상속과 다형성이 확장에 열려있도록 한다.
- FileByteSource, SocketByteSource은 ByteSource라는 하나의 인터페이스를 구현하게하며, 확장에 열려있게 한다.
- 또한, ByteSource 인터페이스를 구현하는 클래스가 ByteSource 타입으로 사용될 수 있게하는 Polymorphic Subtypes와 Method Overriding이라는 다형성이 확장에 열려있도록 만든다. (런타임에 해당 하위 클래스 타입으로 바인딩되기 때문에 가능하다.)
2) 추상화는 변경에 닫혀있도록 한다.
- FlowController 클래스 입장에서는 Collect라는 함수를 사용할 때 받는 인자가 FileByteSource인지 SocketByteSource인지 알 필요없이 추상화 된 Byte Source라는 인자만을 사용하여 변경에는 닫혀있도록 한다.
🚨 OCP를 지키기 위해 지양해야 할 점 - Down Casting
![](https://velog.velcdn.com/images/jxxn_a/post/fcbe4882-c882-4168-ab19-ec94493be59f/image.png)
- FileByteSource, SocketByteSource, MemorySource 등이 ByteSource로 변환된다. (UpCasting)
- 이 과정은 크게 문제는 없지만, 설계한 추상화가 깨지면서 확장될 때 수정해야 할 가능성이 생기기 때문에 더이상 닫혀있지 않게 된다.
- 만약 꼭 필요한 경우 타입 캐스팅 이후에 실행하는 메서드가 변화대상이 아니도록 코드를 작성해야한다.
참고한 블로그