티스토리 뷰
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