21.12.20(월)
SOLID : 객체 지향 설계 5대 원칙
- SOLID를 잘 녹여낸 소프트웨어는 이해하기 쉽우며, 리팩토링과 유지보수가 수월하고 논리정연하다.
S : SRP(Single Responsibility Principle) : 단일 책임 원칙
O : OCP(Open CLosed Principle) : 개방 폐쇄 원칙
L : LSP(Liskov Substitution Principle) : 리스코프 치환 원칙
I : ISP(Interface Segregation Principle) : 인터페이스 분리 원칙
D : DIP(Dependency Incersion Principle) : 의존 역전 원칙
1. SRP - 단일 책임 원칙
클래스와 메소드는 하나의 역할만 하도록 한다.
- 현재 남자 클래스는 남자친구, 아들, 사원, 소대원 4가지 역할과 책임이 너무 많아 피곤하다.
- 이런 경우 4명중 대상이 하나 사라진다면 해당 역할(책임)의 대상이 없어져 남자가 힘들어진다.
- 위와 같이 역할(책임)에 따라 분리하게되면 대상과 함께 없어질 수 있으므로 남자가 덜 힘들다.
- 대상에 따라 역할(책임)을 분리하는것을 '단일 책임 원칙'이라 한다.
2. OCP - 개방 폐쇄 원칙
자신의 확장에는 개방돼 있고, 주변의 변화에 대해서는 닫혀 있어야 한다.
- 운전자는 마티즈와 쏘나타의 변화에 따라 행동(수동 -> 자동)을 의존하여 변하게 된다.
- 운전자의 행동에 영향받지 않도록 하기 위해 마티즈와 쏘나타의 상위클래스 자동차를 둔다.
- 자동차 클래스는 하위에 마티즈와 쏘나타 차종을 상속하여 확장할 수 있고, 운전자의 행동에는 영향 X
3. LSP - 리스코프 치환 원칙
서브타입은 언제나 자신의 상위 타입으로 교체할 수 있어야 한다.
- 객체지향에서의 상속은 조직도, 계층도가 아니라 위 사진처럼 분류도가 되어야 한다.
객체 지향의 상속은 상위 클래스의 특성을 재사용하는 것이다.
객체 지향의 상속은 상위 클래스의 특성을 확장하는것이다.
객체 지향의 상속은 is a kind of 관계를 만족해야 한다.
상속관계 표현 : kind of
포유류 is a kind of 동물 : 포유류는 동물의 한 분류이다.
고래 is a kind of 포유류 : 고래는 포유류의 한 분류이다.
*구현 클래스 is able to 인터페이스 : 구현 분류는 '인터페이스' 할 수 있어야 한다.(able)
- 위와 같은 형태를 LSP 위반 사례로 볼 수 있다.(분류도 X -> 딸이 할아버지 역할을 할 수 있다.)
- 위와 같은 형태를 LSP를 구현한 사례로 볼 수 있다.(분류도 O -> 고래는 동물의 역할을 할 수 있다.)
4. ISP - 인터페이스 분리 원칙
클라이언트는 자신이 사용하지 않는 메소드에 의존 관계를 맺으면 안 된다.
- 단일 책임 원칙을 적용하여 각 클래스별로 역할(책임)을 부여했을때는 다수의 클래스가 생성이 된다.
남자친구 홍길동 = new 남자();
아들 홍길동 = new 남자();
사원 홍길동 = new 남자();
소대원 홍길동 = new 남자();
- 하나의 클래스에 다양한 역할에 따라 인터페이스를 만들어 클래스 수를 줄일 수 있다.
- 상위클래스(사람)가 풍성할 수록 형변환(Casting)이 적게 일어나기 때문에 소스코드가 간결해진다.
5. DIP - 의존 역전 원칙
자신보다 변하기 쉬운 것에 의존하지 마라
class Car {
SnowTire tire = new SnowTire();
}
class Car {
Tire tire;
void setTire(Tire tire) {
this.tire = tire;
}
}
- 상위클래스, 인터페이스, 추상클래스일 수록 변하지 않을 가능성이 크다.
- 하위클래스나 구체적인 클래스가 아닌 더 추상적인것에 의존하라는 것의 DIP(의존 역전 원칙)이다.