애플리케이션에서 달라지는 부분을 찾아내고 달라지지 않는 부분과 분리한다.
달라지는 부분을 찾아서 나머지 코드에 영향을 주지 않도록 "캡슐화" 한다.
구현보다는 인터페이스(interface)에 맞춰서 프로그래밍한다.
변수를 선언할 때 보통 추상 클래스나 인터페이스 같은 상위 형식(supertype)으로 선언해야 한다.
객체를 변수에 대입할 때 상위 형식을 구체적으로 구현한 형식이라서 실제 객체 형식을 몰라도 된다.
상속(inheritance)보다는 구성(composition)을 활용한다.
상호작용하는 객체 사이에는 가능하면 느슨한 결합을 사용해야 한다.
느슨한 결합(Loose Coupling) 은 객체들이 상호작용할 수 있지만, 서로를 잘 모르는 관계를 의미한다.( = 객체 사이의 상호의존성을 최소화 )
느슨하게 결합하는 디자인을 사용하면 변경 사항이 생겨도 무난히 처리할 수 있는 유연한 객체지향 시스템을 구축할 수 있다.
클래스는 확장에는 열려 있어야 하지만 변경에는 닫혀 있어야 한다.
무조건 OCP를 적용한다면 괜히 쓸데없는 일을 하며 시간을 낭비할 수 있으며, 필요 이상으로 복잡하고 이해하기 힘든 코드를 만들게 될 수 있습니다. (OCP를 지키다 보면 새로운 단계의 추상화가 필요한 경우가 종종 있는데, 추상화를 하다 보면 코드가 복잡해집니다.)
그래서 우리가 디자인한 것 중에서 가장 바뀔 가능성이 높은 부분을 중점적으로 살펴보고 OCP를 적용하는 방법이 가장 좋습니다.
추상화된 것에 의존하게 만들고, 구상 클래스에 의존하지 않게 만든다.