객체지향 프로그래밍의 특성과 장점을 끌어올리기 위해 프로그램을 설계할 때 필요한 5가지 원칙이 있다
원칙을 잘 지킨다면 유지보수하기 쉽고, 유연하고, 확장이 쉬운 소프트웨어를 만들수 있을것이다
💡 캡슐화란?
객체의 속성과 행위(메서드)를 하나로 묶고, 실제 구현 내용 일부를 외부에 감추어 은닉한다
🤨 책임이 어떤 의미이지
SRP에서 이야기하는 책임은, 기능 이라는 뜻으로 생각하면 된다
한 클래스가 수행할 수 있는 기능(책임)이 여러 개라면, 클래스 내부의 함수끼리 강한 결합을 발생할 가능성이 높아진다
위 내용은 객체지향 설계의 핵심 요소를 위반하는 행위가 되는 것이다
새로운 요구사항이나 프로그램 변경에 의해 클래스 내부의 동작들이 연쇄적으로 변경되어야 할 수도 있다
위 상황은 유지보수가 비효율적이므로, 책임을 잘게 쪼개어 분리시킬 필요가 있다
어떤 모듈의 기능을 하나 수정할 때, 그 모듈을 이용하는 다른 모듈들도 하나하나 고쳐줘야 한다면 유지보수가 매우 복잡할 것이다
개방 폐쇄 원칙을 잘 적용하여 기존 코드를 변경하지 않아도 기능을 새롭게 만들거나 변경할 수 있도록 해야한다
지키지 않으면, 객체지향 프로그래밍의 장점 유연성, 재사용성, 유지보수성 등을 잃어버린다
🤨 어떻게 OCP를 구현할까
추상화(인터페이스) 와 상속(다형성) 등을 통해 구현할 수 있다.
변화가 잦은 부분들을 추상화 함으로써 기존 코드를 수정하지 않고 기능을 확장할 수 있도록 함으로써 유연성을 높이는 것이 OCP의 핵심이다
IS-A
)가 성립해야 한다리스코프 치환 원칙을 지키지 않으면 개방 폐쇄 원칙을 위반하게 되는 것이다
기능 확장을 위해 기존의 코드를 여러 번 수정해야 할것이다
그러므로 상속 관계를 잘 정의하여 리스코프 치환 원칙이 위반되지 않도록 설계해야 한다
개별적인 클라이언트가 필요로 하는 인터페이스들을 분리함으로써, 클라이언트가 사용하지 않은 인터페이스에 변경이 발생하더라도 영향을 받지 않도록 만들어야 한다
SRP 와 ISP 는 객체의 크기가 커지는 것을 방지해 준다.
객체가 단일 책임을 갖도록 하고 클라이언트마다 특화된 인터페이스를 구현하게 함으로써 한 기능의 변경이 다른 곳 까지 미치는 영향을 최소화하고, 기능 추가 및 변경에 용이하도록 만들어 준다
LSP 와 DIP 는 OCP 를 도와준다.
OCP는 자주 변화되는 부분을 추상화하고 다형성을 이용함으로써 기능 확장에는 용이하되 기존 코드의 변화에는 보수적이도록 만들어 준다
변화되는 부분을 추상화 하도록 도와주는 원칙이 DIP, 다형성 구현을 도와주는 원칙이 LSP 이다