티스토리 뷰

LSP(Liskov Substitution Principle)원칙은 서브타입은 언제나 기반타입으로 교체할 수 있어야한다는 원칙이다. SOLID에서 가장 이해하기 힘든 원칙이었다. (지금도... )


public class Rectangle {

	protected double width;
	protected double height;
	
	public double getWidth() {
		return width;
	}
	public void setWidth(double width) {
		this.width = width;
	}
	public double getHeight() {
		return height;
	}
	public void setHeight(double height) {
		this.height = height;
	}
	
	public void ShowArea(){
		System.out.println(width * height); 
	}
	
}

  
public class Square extends Rectangle{

	@Override
	public void setWidth(double width){
		this.width = width;
		this.height = width;
	}
	
	@Override
	public void setHeight(double height){
		this.height = height;
		this.width = height; 
	}
}


다음 코드를 보면, 정사각형은 직사각형이 맞기 때문에, 위 코드는 맞는 표현이다. 하지만, LSP원칙에 어긋나는 코드이다.  위 코드를 실행하면, 호출 코드에서 가로와 세로(setWidth, setHeight)를 호출해주어야한다. 하지만, Square는 정사각형이기 때문에 가로, 세로길이가 같고, setWidthandHeight()와 같은 함수 하나만 호출하여 길이를 적용해야한다.


이런 경우 호출코드에서

Rectangle rec = RectFactory();
		rec.setHeight(20);
		rec.setWidth(13);
		rec.ShowArea();


위 코드를 실행하게 되면, RectFactory()에서 반환하는 타입에 따라, 값의 결과가 다르게 될 것이다.

20 * 13 의 결과로는 260이므로 260을 예상하지만, RectFactory()에서 Square를 반환한다면, 2번의 변의 길이를 설정하고, 13으로 설정된 정사각형의 면접 13*13 = 169가 출력될 것이다. 

 


'Paradigm > OOP' 카테고리의 다른 글

[OOP] Dependency Inversion Principle  (0) 2013.10.29
[OOP] Interface Segregation Principle  (0) 2013.10.29
[OOP] Single Responsibility Principle  (0) 2013.10.29
[OOP] Open-Closed Principle  (0) 2013.10.28
[OOP] 객제지향, 디자인 원리  (0) 2013.09.27
댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
Total
Today
Yesterday