- LSP(Liskov Substitution Principle) : 리스코프 치환 원칙
리스코프 치환 원칙은 상속 관계에서 하위 클래스는 상위 클래스를 대체할 수 있어야 한다는 원칙이다. 상위 클래스의 기능을 하위 클래스에서 변경하지 않고 사용할 수 있어야 하며, 상속에서 발생할 수 있는 문제점을 방지한다.
아래는 리스코프 치환 원칙이 위배된 코드이다.
class Rectangle {
int width;
int height;
public int getArea() {
return width * height;
}
/* Constructor, getters, and setters */
}
class Square extends Rectangle {
@Override
public void setWidth(int width) {
this.width = width;
this.height = width;
}
@Override
public void setHeight(int height) {
this.width = height;
this.height = height;
}
}
위의 코드에서 Square 클래스는 Rectangle 클래스를 상속받아 구현한다. Square 클래스에서 setWidth() 메서드와 setHeight() 메서드는 각각 너비와 높이를 동일한 값으로 설정한다.
그러나, Rectangle 클래스는 너비와 높이가 각각 다른 값을 가질 수 있기 때문에, Square 클래스는 Rectangle 클래스의 하위 타입으로 대체될 수 없다.
아래는 리스코프 치환 원칙이 적용된 코드이다.
abstract class Shape {
public abstract int getArea();
}
class Rectangle extends Shape {
int width;
int height;
public int getArea() {
return width * height;
}
/* Constructor, getters, and setters */
}
class Square extends Shape {
int side;
public int getArea() {
return side * side;
}
/* Constructor, getters, and setters */
}
위의 코드에서 Shape는 추상 클래스로, getArea() 메서드를 정의한다. Rectangle 클래스와 Square 클래스는 이를 상속받아 구체적으로 구현한다.
이렇게 하면 Rectangle 클래스와 Square 클래스가 Shape 클래스의 하위 타입으로 대체될 수 있게 된다.