SOLID 5원칙
객체 지향 프로그래밍을 하면서 지켜야 할 5대 설계 원칙
SRP, Single Responsibility Principle, 단일 책임 원칙
하나의 모듈에 한 가지 책임을 가져야 한다는 것
모듈이 변경되는 이유가 한가지여야 함
해당 모듈이 여러 대상에 대해 책임을 가져서는 안되고, 오직 하나의 대상에 대해서만 책임을 져야 함
제대로 지킬 경우 변경이 필요할 때 수정할 대상이 명확해짐
의존성이 많을 때에 변경 요청이 오면 딱 1가지만 수정하면 되기 때문에 시스템이 커질수록 장점 극대화
적절하게 책임과 관심이 다른 코드를 분리하고, 서로 영향을 주지 않도록 추상화함으로써 애플리케이션의 변화에 손쉽게 대응
OCP, Open-Closed Principle, 개방 폐쇄 원칙
확장에 대해 열려있고, 수정에 대해서는 닫혀있어야 함
확장에 대해 열림 : 요구사항이 변경될 때 새로운 동작을 추가하여 애플리케이션 기능 확장 가능
수정에 대해 닫힘 : 기존 코드를 수정하지 않고 애플리케이션의 동작을 추가하거나 변경 가능
해당 원칙을 지키기 위해 추상화에 의존해야 함
추상화를 통해 변하는 것들은 숨기고, 변하지 않는 것들에 의존하도록 하면 기존 코드, 클래스를 수정하지 않고 애플리케이션 확장 가능
ISP, Interface Segregation Principle, 인터페이스 분리 원칙
객체가 충분히 높은 응집도의 작은 단위로 설계됐더라도, 목적과 관심이 각기 다른 클라이언트가 있다면 인터페이스를 통해 적절하게 분리할 필요가 있음
클라이언트의 목적과 용도에 적합한 인터페이스만을 제공하는 것
이 원칙을 준수함으로써 모든 클라이언트가 자신의 관심에 맞는 퍼블릭 인터페이스(외부에서 접근 가능한 메세지)만을 접근하여 불필요한 간섭을 최소화할 수 있으며, 기존 클라이언트에 영향을 주지 않은 채 유연하게 객체의 기능을 확장하거나 수정 가능
LSP, Liskov Substitution Principle, 리스코프 치환 원칙
하위 타입은 상위 타입을 대체할 수 있어야 함
해당 객체를 사용하는 클라이언트는 상위 타입이 하위 타입으로 변경되어도, 차이점을 인식하지 못한 채 상위 타입의 인터페이스를 통해 서브 클래스를 사용할 수 있어야 함
자식 클래스가 부모 클래스를 대체하기 위해서는 부모 클래스에 대한 클라이언트의 가정을 준수해야 함
대체 가능성을 결정하는 것은 해당 객체를 이용하는 클라이언트
DIP, Dependency Inversion Principle, 의존 역전 원칙
고수준 모듈은 저수준 모듈의 구현에 의존해서는 안되며, 저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야 함
추상화에 의존하며, 구체화에는 의존하지 않음
고수준 모듈 : 변경이 없는 추상화된 클래스(또는 인터페이스)
저수준 모듈 : 변하기 쉬운 구체 클래스
의존 역전 원칙이 위배될 경우 개방 폐쇄 원칙 또한 위배될 가능성이 높음
의존 역전 원칙에서 의존성이 역전되는 시점은 컴파일 시점