-
SOLID
- 객체지향 설계에서 지켜야할 5개의 원칙(SRP, OCP, LSP, ISP, DIP)
- 변경사항에 유연하게 대처하고 확장성있는 시스템을 만들기 위해 적용
좋은 설계란?
- 요구사항이나 변경이 있을 때 가능한 영향 받는 부분이 적어야함
1. SRP(Single Responsibility Principle) : 단일 책임 원칙
- 객체는 단 하나의 책임만 가져야 한다는 원칙
- 책임이 많으면 서로 다른 역할을 수행하는 코드끼리 강하게 결합될 가능성이 높아짐
- 책임이 많으면 클래스가 변경될 가능성이 높음
- 여러 객체들이 하나의 책임만 갖도록 분배하면 시스템에 변화가 생기더라도 영향을 최소화 할 수 있음
2. OCP(Open-Closed Principle) : 개방 폐쇄 원칙
- 기존의 코드를 변경하지 않으면서(Closed) 기능을 추가(Open)할 수 있도록 설계가 되어야 한다는 원칙
- 확장에 대해서는 개방적이고 수정에 대하서는 폐쇄적이라는 의미
- 캡슐화를 통해 여러 객체에서 사용하는 같은 기능을 인터페이스에 정의하고 상속을 통해 다형성을 이용
3. LSP(Liskov Substitution Principle) : 리스코프 치환 원칙
- 자식 클래스는 최소한 자신의 부모 클래스에서 가능한 행위는 수행할 수 있어야한다는 원칙
- 부모 클래스와 자식 클래스 사이의 행위가 일관되어야함
- 부모 클래스의 인스턴스 대신에 자식 클래스의 인스턴스로 대체 가능해야함
- 부모 클래스에서 상속받은 메서드들이 자식 클래스에서 오버라이드 되지 않아야함
- 자식 클래스는 부모 클래스의 책임을 무시하거나 재정의하지 않고 확장만 수행해야함
- 피터 코드의 상속 규칙을 만족하면 LSP를 만족함
4. ISP(Interface Segregation Principle) : 인터페이스 분리 원칙
- 인터페이스를 클라이언트에 특화되도록 분리시키는 원칙
- SRP는 객체의 단일 책임을 의미하고 ISP는 인터페이스의 단일 책임을 의미
- SRP를 만족하면 ISP를 만족할 수 있지만 항상 그런건 아님
5. DIP(Dependency Inversion Principle) : 의존 역전 원칙
- 고수준의 모듈은 저수준의 모둘의 구현에 의존해서는 안되는 원칙
- 구체적인 클래스보다는 인터페이스나 추상 클래스와 의존 관계를 맺도록 설계해야함