SOLID 5원칙


객체 지향 프로그래밍을 하면서 지켜야 할 5대 설계 원칙

SRP, Single Responsibility Principle, 단일 책임 원칙

  • 하나의 모듈에 한 가지 책임을 가져야 한다는 것

  • 모듈이 변경되는 이유가 한가지여야 함

  • 해당 모듈이 여러 대상에 대해 책임을 가져서는 안되고, 오직 하나의 대상에 대해서만 책임을 져야 함

  • 제대로 지킬 경우 변경이 필요할 때 수정할 대상이 명확해짐

  • 의존성이 많을 때에 변경 요청이 오면 딱 1가지만 수정하면 되기 때문에 시스템이 커질수록 장점 극대화

  • 적절하게 책임과 관심이 다른 코드를 분리하고, 서로 영향을 주지 않도록 추상화함으로써 애플리케이션의 변화에 손쉽게 대응


OCP, Open-Closed Principle, 개방 폐쇄 원칙

  • 확장에 대해 열려있고, 수정에 대해서는 닫혀있어야 함

  • 확장에 대해 열림 : 요구사항이 변경될 때 새로운 동작을 추가하여 애플리케이션 기능 확장 가능

  • 수정에 대해 닫힘 : 기존 코드를 수정하지 않고 애플리케이션의 동작을 추가하거나 변경 가능

  • 해당 원칙을 지키기 위해 추상화에 의존해야 함

  • 추상화를 통해 변하는 것들은 숨기고, 변하지 않는 것들에 의존하도록 하면 기존 코드, 클래스를 수정하지 않고 애플리케이션 확장 가능


ISP, Interface Segregation Principle, 인터페이스 분리 원칙

  • 객체가 충분히 높은 응집도의 작은 단위로 설계됐더라도, 목적과 관심이 각기 다른 클라이언트가 있다면 인터페이스를 통해 적절하게 분리할 필요가 있음

  • 클라이언트의 목적과 용도에 적합한 인터페이스만을 제공하는 것

  • 이 원칙을 준수함으로써 모든 클라이언트가 자신의 관심에 맞는 퍼블릭 인터페이스(외부에서 접근 가능한 메세지)만을 접근하여 불필요한 간섭을 최소화할 수 있으며, 기존 클라이언트에 영향을 주지 않은 채 유연하게 객체의 기능을 확장하거나 수정 가능


LSP, Liskov Substitution Principle, 리스코프 치환 원칙

  • 하위 타입은 상위 타입을 대체할 수 있어야 함

  • 해당 객체를 사용하는 클라이언트는 상위 타입이 하위 타입으로 변경되어도, 차이점을 인식하지 못한 채 상위 타입의 인터페이스를 통해 서브 클래스를 사용할 수 있어야 함

  • 자식 클래스가 부모 클래스를 대체하기 위해서는 부모 클래스에 대한 클라이언트의 가정을 준수해야 함

  • 대체 가능성을 결정하는 것은 해당 객체를 이용하는 클라이언트


DIP, Dependency Inversion Principle, 의존 역전 원칙

  • 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안되며, 저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야 함

  • 추상화에 의존하며, 구체화에는 의존하지 않음

  • 고수준 모듈 : 변경이 없는 추상화된 클래스(또는 인터페이스)

  • 저수준 모듈 : 변하기 쉬운 구체 클래스

  • 의존 역전 원칙이 위배될 경우 개방 폐쇄 원칙 또한 위배될 가능성이 높음

  • 의존 역전 원칙에서 의존성이 역전되는 시점은 컴파일 시점