객체 지향적 설계 원칙
SRP(Single Responsibility Principle): 단일 책임의 원칙
- 클래스는 단 하나의 책임을 가져야 하며, 클래스가 제공하는 모든 서비스는 그 하나의 책임을 수행하는데 집중되어있어야 합니다. 또한 클래스를 변경하는 이유는 단 하나의 이유여야 합니다.
- 이는 한 클래스의 변화가 다른 클래스로의 변화로 이어지는 것으로 부터 해방시켜 줍니다.
- 응집성을 높여주 모듈간의 종속성은 낮추어줍니다.
- 나아가, 책임을 적절히 분배함으로써 코드의 가독성 향상, 유지보수의 용이라는 이점까지 누릴 수 있게 됩니다.
OCP(Open-Closed Principle): 개방 폐쇄의 원칙
- 확장에는 열려있어야 하나, 변경에는 닫혀있어야 합니다.
- 이는 요구사항의 변경이나 추가사항이 있더라도, 기존 구성 요소의 변경은 없도록 하면서도, 기존 구성요소를 확장해서 재사용 가능한 코드를 만드는 기반을 갖추게 해줍니다.
- 개방-폐쇄의 원칙을 가능토록 하는 중요 매커니즘은 추상화와 다형성입니다.
LSP(Liskov Substitution Principle): 리스코프 치환 원칙
- 일반화 관계에 대한 이야기이며, 자식 클래스는 최소한 자신의 부모 클래스에서 가능한 행위를 수행할 수 있어야 합니다.
- 즉, LSP를 만족하게 되면, 프로그램에서 부모 클래스의 인스턴스 대신에 자식 클래스의 인스턴스로 대체하더라도 프로그램의 의미는 변화하지 않게 됩니다.
- "is a kind of"의 관계입니다.
- 이를 만족하는 간단한 방법은 재정의, 즉 오버라이드를 하지 않도록 하는 것입니다.
- "자식 클래스가 부모 클래스의 책임을 무시하거나 재정의하지않고 확장만 수행한다"라는 규칙을 지키는 것입니다.
ISP(Interface Segregation Principle): 인터페이스 분리 원칙
- 인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 합니다.
- 즉, 범용적인 인터페이스보다는 Client가 실제로 사용하는 Interface를 만들어야한다는 의미입니다.
- 인터페이스가 지나치게 범용적으로 구현된다면, 그 인터페이스를 상속받은 클라스는 자신이 사용하지 않는 인터페이스까지 구현해야하기 때문입니다.
DIP(Dependency Inversion Principle): 의존 역전의 원칙
- 어떤 Class를 참조해야하는 상황이 생긴다면, 그 Class를 직접 참조하기보다는 그 대상의 추상 클래스를 만들어서 사용하라는 원칙입니다.
- DIP를 만족하는 설계는 변화에 유연한 시스템이 됩니다.