[OOP] SOLID 원칙 - OCP (개방폐쇄의원칙)

jxxn_a·2023년 11월 23일
0

TIL

목록 보기
25/28

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

  • 개방폐쇄의 원칙을 의미하며, 소프트웨어의 요소들은 확장에는 열려있어야하고, 변경에는 닫혀있어야한다.
  • 기능이 확장 될 때 기존에 작성된 코드는 변경되지 않아야한다.
  • 객체지향 프로그래밍의 특징 중 '추상화', '상속', '다형성'에 해당되는 것 같다.

- (예시) 캐릭터 하나를 생성한다고 할 때, 각 캐릭터들의 움직임이 다를 경우 움직임의 패턴 구현을 하위 클래스에 맡기면 캐릭터의 수정은 필요가 없고(close), 움직임의 패턴만 재정의하면 된다.(open)


💫 OCP 구조

  • FileByteSource는 파일에서 Byte를 읽어오는 역할을 하는 클래스
  • SocketByteSource는 소켓에서 Byte를 읽어오는 역할을 하는 클래스
    => ByteSource를 구현하는 FileByteSource와 SocketByteSource는 ByteSource를 상속받고, 다형성에 의해 ByteSource 객체의 참조값을 저장할 수 있는 변수에는 ByteSource의 하위타입까지 담을 수 있다.

💫 OCP 구조에서 기능 추가

  • 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

  • FileByteSource, SocketByteSource, MemorySource 등이 ByteSource로 변환된다. (UpCasting)
  • 이 과정은 크게 문제는 없지만, 설계한 추상화가 깨지면서 확장될 때 수정해야 할 가능성이 생기기 때문에 더이상 닫혀있지 않게 된다.
  • 만약 꼭 필요한 경우 타입 캐스팅 이후에 실행하는 메서드가 변화대상이 아니도록 코드를 작성해야한다.

참고한 블로그

0개의 댓글