- 이 글은 로버트 C.마틴의 Clean Architecture를 기반으로 작성되었습니다. (가능하면 책을 읽어보는것을 추천한다.)
- 개요
바바라 리스코프가 하위 타입에 대해 정의한 원칙이다. S 타입의 객체 o1, T 타입의 객체 o2가 있고, T 타입을 이용해서 정의한 프로그램 P에서 o2 대신 o1을 치환해도 P의 행위가 변하지 않는다면, S는 T의 하위타입이다.
- LSP 예제
모델들을 관리하는 어플리케이션을 살펴보자. Model 클래스가 있다. 실세계에서는 상당히 많은 메소드가 있겠지만 이 예제에서는 모델 코드를 반환하는 getModelCode() 메소드만 있다고 가정한다. Model 에는 셀수없이 많은 종류의 Model이 있지만 현재는 Laundry Model과 TV Model의 하위 타입만 있다고 가정하자.
Model Managerment 의 모델 코드를 얻으려는 행위가 Laundry Model나 TV Model 어느 타입을 사용하더라도 변하지 않는다. 예제를 위해 실세계의 행위를 지나치게 간략화 시킨면이 없진 않지만, 어쨌든 이들 하위 타입은 모두 Model 타입을 치환할 수 있다.
- LSP 위반 예제
LSP를 위반하는 예제중에 꽤나 유명한 예제가 있는데, 정사각형/직사각형 예제이다.
코드 관점이 아니라 개념적인 관점에서 생각해보자. 직사각형은 네 내각의 크기가 모두 90도 이다. 정사각형은 직사각형의 성질을 만족하면서 네 변의 길이가 모두 같은 사각형이다. 그렇다면 아래처럼 정사각형을 직사각형의 하위 타입이라 생각할 수 있지 않을까?
직사각형은 폭과 높이의 길이가 다를 수 있다. 하지만 정사각형은 그렇지 않다. main 함수에서 참조 타입이 직사각형인데, 실제 객체가 정사각형이라면 폭과 높이의 길이를 따로 설정할 수 있다는 생각으로 설정하게 된다. 그리고 넓이를 구하면 6을 기대하지만 결과는 4로 나온다.
public class Rectangle {
private double width;
private double height;
public void setWidth(double width) {
this.width = width;
}
public void setHeight(double height) {
this.height = height;
}
public double getArea() {
return this.width * this.height;
}
}
public class Square extends Rectangle{
@Override
public void setWidth(double width) {
super.setWidth(width);
super.setHeight(width);
}
@Override
public void setHeight(double height) {
super.setHeight(height);
super.setWidth(height);
}
}
public static void main(String[] args){
Rectangle r = new Square();
r.setHeight(3);
r.setWidth(2);
System.out.println(r.getArea());
}
위와 같은 상황은 리스코프 치환 원칙을 위반한다. SomeOne이 하위 타입에 의존하여(정사각형이냐 직사각형이냐에 따라) 행위(폭과 높이의 길이를 각각 설정할 수 있는지의 행위)가 변경되기 때문이다. 즉 하위 타입으로 치환이 되질 않는다.
- 결론
LSP는 코드 수준에서의 팁 정도의 스킬이 아니다. 아키텍처 수준으로 확장하여 하위타입을 치환했을 때 행위를 위반하지 않는지 생각해보아야 한다. 그렇지 않으면 어떤 타입이냐에 따른 분기에 대한 코드로 고통받는다.
'Concepts > SW Architecture' 카테고리의 다른 글
설계원칙 - SOLID(DIP) (0) | 2021.02.10 |
---|---|
설계원칙 - SOLID(ISP) (0) | 2021.02.10 |
설계원칙 - SOLID(OCP) (0) | 2021.02.10 |
설계원칙 - SOLID(SRP) (0) | 2021.02.10 |
프로그래밍 패러다임 - 함수형 프로그래밍 (0) | 2021.02.10 |
댓글