SOLID 란?
좋은 객체 지향 설계의 5가지 원칙으로, 변화에 유연하게 대처할 수 있는 소프트웨어를 설계하기 위해 사용하는 원칙.
SRP : 단일 책임 원칙(single responsibility principle)
OCP : 개방 패쇄 원칙(Open/closed principle)
LSP : 리스코프 치환 원칙(Liskov substitution principle)
ISP : 인터페이스 분리 원칙(Interface segregation principle)
DIP : 의존관계 역전 원칙(Dependency inversion principle)
1. SRP : 단일 책임 원칙(single responsibility principle)
한 클래스는 하나의 책임만 가져야 하는 설계 원칙
- 말 그대로 하나의 클래스는 하나의 책임만을 가져야하는 원칙으로, 클래스를 변경해야 할 이유는 단 한가지 이유여야 하는 것이다.
- 한 클래스에게 하나의 책임만을 부여하기 위해, 여러 클래스를 설계할 때 계층을 나누고 범위를 조절하는 것이 중요하다.
- SRP가 지켜지지 않을 시, 하나의 책임에 대한 변경이 여러 클래스에 영향을 줄 수 있으므로 더 많은 변경이 필요하다.
2. OCP : 개방 패쇄 원칙(Open/closed principle)
확장에는 열려 있지만 변경에는 닫혀 있는 설계 원리
- 말 그대로 해석하면 말이 안된다는 설계 원리라고 생각이 들 수 있지만,
기존 코드를 변경하지 않고 (closed) 기존 기능을 수정하거나 새로운 기능을 추가 (open) 할 수 있는 원칙이다.
- OCP 원칙을 적용하기 위해, 확장될 부분과 변하지 않을 부분을 구분하고, 두 클래스가 만나는 지점을 인터페이스로 정의해야 한다.
- 위 방법을 적용하여, 다형성을 이용하여 기능을 추가/수정하더라도 클라이언트 코드 변경은 불가피하다. 이는 OCP 원칙을 위배되는 것이며, 이를 해결하기 위해서 객체를 생성하고, 연관관계를 맺어주는 별도의 조립, 설정자가 필요하다.
3. LSP : 리스코프 치환 원칙(Liskov substitution principle)
프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 하는 원칙
- 예를 들어, 클래스 B가 클래스 A를 상속 받은 클래스라면, 실행 중인 프로그램이 문제 없도록 클래스 A를 클래스 B로 대체할 수 있다는 것이다.
- 이는 상위 클래스를 하위 클래스로 대체하기 위해 하위 클래스는 상위 클래스의 규약을 다 지켜야 하는 것을 의미 한다.
- 한마디로, 상속을 조심히 잘 사용해라~ 하는 원칙이다.
4. ISP : 인터페이스 분리 원칙(Interface segregation principle)
클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야 한다는 원칙
- 클라이언트가 사용하지 않는 인터페이스를 강제로 구현해서는 안되며, 하나의 일반적인 인터페이스 대신에 여러 개의 구체적인 인터페이스를 만들어 사용하는 것을 제안하는 원칙이다.
- ISP 원칙을 통해, 불필요한 결합을 피해 인터페이스가 명확해지고, 변경에도 유연해 질 수 있다.
5. DIP : 의존관계 역전 원칙(Dependency inversion principle)
프로그래머는 추상화에 의존해야지, 구체화에 의존하면 안된다. 라는 원칙
- 쉽게 말하면, 변하기 쉬운 것(구현 클래스)에 의존 하지 말고 잘 변하지 않는 것(인터페이스)에 의존하라는 원칙이다.
- 추상화 된 모듈은 구체화 된 모듈에 의존하면 안되며, 반대로 구체화 된 모듈이 추상화 된 모듈에게 의존이 역전되도록 설계되어야 한다.
참고 자료
https://ko.wikipedia.org/wiki/SOLID_(객체_지향_설계)
https://www.inflearn.com/course/스프링-핵심-원리-기본편#
https://velog.io/@cgw0519/디자인패턴-SOLID