SOLID 원칙
객체지향 설계5대 원칙이라 부르는데 SRP(단일 책임 원칙), OCP(개방-폐쇄 원칙), LSP(리스코프 치환 원칙), ISP(인터페이스 분리 원칙), DIP(의존 역전 원칙)을 말하고 앞자를 따서 SOILD 원칙이라고 부른다.
1. 단일 책임 원칙 (Single Responsiblity Principle)
"어떤 클래스를 변경해야 하는 이유는 오직 하나뿐 이어야한다 - 로버트 C 마틴"
클래스는 그 책임을 완전히 캡슐화해야 함을 말한다.
설명
- 작성된 클래스는 하나의 기능만 가지며 클래스가 제공하는 모든 서비스는 그 하나의 책임을 수행하는데 집중되어야 한다.
- 작성된 클래스가 여러 기능을 가질 경우 기능에 대한 분기 처리를 해야 하기에 코드의 복잡도만 높아지므로 유지보수 시 좋지 않다
2. 개방-폐쇄 원칙 (Open Closed Principle)
"소프트위어 엔티티(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하지만 변경에 대해서는 닫혀 있어야 한다. - 로버트 C 마틴"
확장에는 열려있고 수정에는 닫혀있는. 기존의 코드를 변경하지 않으면서( Closed), 기능을 추가할 수 있도록(Open) 설계가 되어야 한다는 원칙을 말한다.
설명
- 변경을 위한 비용은 가능한 줄이고 확장을 위한 비용은 가능한 극대화해야 한다는 의미로, 요구사항의 변경이나 추가사항이 발생하더라도, 기존 구성요소는 수정이 일어나지 말아야 하며, 기존 구성요소를 쉽게 확장해서 재사용할 수 있어야 한다는 뜻
예시) JDBC : DB의 확장에는 열려있고, JDBC 인터페이스 변화에는 닫혀 있다. (기존 코드 수정X)
3. 리스코프 치환 원칙 (Liskov Substitution Principle)
"서브 타입은 언제든 자신의 기반 타입으로 교체할 수 있어야 한다. - 로버트 C 마틴"
자식 클래스는 언제나 자신의 부모 클래스를 대체할 수 있다는 원칙이다. 즉 부모 클래스가 들어갈 자리에 자식 클래스를 넣어도 계획대로 잘 작동해야 한다.
자식클래스는 부모 클래스의 책임을 무시하거나 재정의하지 않고 확장만 수행하도록 해야 LSP를 만족한다.
설명
- 딸은 아버지의 역할을 수행할 수 없다. 이에 반해 펭귄은 동물의 역할을 수행할 수 있다. 즉, 객체 지향에서의 상속은 조직도나 계층도가 아닌 분류도가 되어야 한다.
- 하위 클래스의 인스턴스는 상위형 객체 참조 변수에 대입해 상위 클래스의 인스턴스 역할을 하는데 문제가 없어야한다.
4. 인터페이스 분리 원칙 (Interface Segregation Principle)
"클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안된다. - 로버트 C 마틴"
한 클래스는 자신이 사용하지않는 인터페이스는 구현하지 말아야 한다. 하나의 일반적인 인터페이스보다 여러개의 구체적인 인터페이스가 낫다.
설명
- 인터페이스 최소주의 원칙
- 인터페이스를 통해 메서드를 제공할 때 최소한의 메서드만 제공하라는 것.
- 범용 인터페이스보다 전문화된 인터페이스를 사용하라는 것.
5. 의존 역전 원칙 (Dependency Inversion Principle)
"고차원 모듈은 저차원 모듈에 의존하면 안 된다. 이 두 모듈 모두 다른 추상화된 것에 의존해야 한다."
"추상화된 것은 구체적인 것에 의존하면 안 된다. 구체적인 것이 추상화된 것에 의존해야 한다."
"자주 변경되는 구체(Concrete) 클래스에 의존하지 마라"
"자신보다 변하기 쉬운 것에 의존하지 마라"
- 로버트 C 마틴 -
의존 관계를 맺을 때 변화하기 쉬운 것 또는 자주 변화하는 것보다는 변화하기 어려운 것, 거의 변화가 없는 것에 의존하라는 것이다. 한마디 로 구체적인 클래스보다 인터페이스나 추상 클래스와 관계를 맺으라는 것이다.
// 기존 코드
class 201Class {
Student student = new Ksmart44Gi();
}
// DIP 적용
class 201Class {
Student student;
void setStudent(Student student) {
this.student = student;
}
}
설명
- 자동차는 스노우 타이어에 의존하고 있어 타이어 변경 시 소스코드가 변하기 쉬워짐
- 상위 클래스일수록, 인터페이스일수록, 추상 클래스일수록 변하지 않을 가능성이 높기에 하위 클래스나 구체적 클래스가 아닌 상위 클래스, 인터페이스, 추상 클래스를 통해 의존하라는 것이 바로 의존 역전 원칙 ex) JDBC
'코딩 공부 > CS' 카테고리의 다른 글
[CS] 프레임워크와 라이브러리 (0) | 2023.02.13 |
---|---|
[CS] 메모리 구조 (Stack, Heap, Data, Code) (0) | 2023.02.02 |
[CS] REST API (REST, RESTful) (0) | 2022.12.07 |
[CS] 아키텍처(Architecture) (0) | 2022.12.04 |
객체지향 프로그래밍 (0) | 2022.08.31 |