본문 바로가기
Concepts/SW Architecture

설계원칙 - SOLID(LSP)

by ocwokocw 2021. 2. 10.

- 이 글은 로버트 C.마틴의 Clean Architecture를 기반으로 작성되었습니다. (가능하면 책을 읽어보는것을 추천한다.)

- https://ko.wikipedia.org/wiki/%EC%A7%81%EC%82%AC%EA%B0%81%ED%98%95

- 개요

바바라 리스코프가 하위 타입에 대해 정의한 원칙이다. 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

댓글