SOLID 원칙
SRP (Single Responsibility Principle)
단일 책임 원칙
- 한 클래스는 단일의 책임만 가져야 한다.
- 클래스를 변경하는 이유는 단 하나여야 함.
- 이를 지키지 않으면, 한 책임의 변경에 의해 다른 책임과 관련된 코드에 영향을 미칠 수 있음
- 유지보수가 매우 비효율적
OCP (Open Closed Priciple)
개방 폐쇄 원칙
- 확장에는 열려있고, 변경에는 닫혀있다.
- 기존의 코드를 변경하지 않고 기능을 수정하거나 추가할 수 있도록 설계해야 함
- 이를 지키지 않으면, instance of와 같은 연산자를 사용하거나 다운 캐스팅 발생
어떤 모듈의 기능을 하나 수정할 때, 그 모듈을 이용하는 다른 모듈들 역시 줄줄이 고쳐야 한다면 유지보수가 복잡할 것이다. 개방 폐쇄 원칙을 잘 적용하여 코드를 변경하지 않아도 기능을 새롭게 만들거나 변경할 수 있도록 해야 한다.
LSP (Liskov Substitution Principle)
리스코프 치환 법칙
- 하위타입은 언제나 상위타입으로 교체할 수 있어야 한다.
- 상속관계에서는 꼭 일반화 관계 (IS - A)가 성립해야 한다는 의미(일관성 있는 관계인지)
- 상속관계가 아닌 클래스들을 상속관계로 설정하면, 이 원칙이 위배됨(재사용 목적으로 사용하는 경우)
리프코프 치환 원칙을 지키지 않으면 개방 폐쇄 원칙을 위반하게 되는 것. 기능 확장을 위해 기존의 코드를 여러 번 수정해야할 것이다.
ISP (Interface Segregation Principal)
인터페이스 분리 원칙
- 클라이언트는 자신이 사용하는 메소드에만 의존해야 한다는 원칙
- 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 않아야 함
- 하나의 통상적인 인터페이스보다는 차라리 여러 개의 세부적인 인터페이스가 더 좋음
- 인터페이스는 해당 인터페이스를 사용하는 클라이언트 기준으로 잘게 분리되어야 함
각 클라이언트가 필요로 하는 인터페이스들을 분리함으로써, 클라이언트가 사용하지 않는 인터페이스에 변경이 발생하더라도 영향을 받지 않도록 만들어야 하는 것이 핵심
DIP (Dependecy Inversion Principal)
의존성 역전 원칙
- 의존 관계를 맺을 때, 변하기 쉬운 것(구체적인 것) 보다는 어려운 것(추상적인 것)에 의존해야 함
- 하위 모듈의 변경이 상위 모듈의 변경을 요구하는 의존성을 끊어 내야 함
구체화된 클래스에 의존하기 보다는 추상 클래스나 인터페이스에 의존해야 한다는 뜻
총정리
- SRP : 컨플릭을 방지, 역할에 해당하는 서비스를 잘 찾는다.
- OPC : if else에서 반복적인 케이스가 보이면, 클래스 분리를 고려
- LSP : 상속보다는 if를 고려하고, 상속을 해도 비슷하게 만들어야 교체가 쉽다.
- ISP : 인터페이스도 OCP를 따라야 구현이 편리하고 재활용성이 올라감
- DIP : 하위 모듈에 너무 의존하면 변경이 어려움, 중간 if를 둬야 하위 모듈 변경이 쉽다.