※ 리스코프 치환 원칙(Liskov Substitution Principle)

부모 클래스와 자식 클래스 사이의 행위가 일관성 있어야 한다는 의미로 LSP를 만족하면 프로그램에서 부모 클래스의 인스턴스 대신에 자식 클래스의 인스턴스로 대체해도 프로그램의 의미는 변화되지 않는다.


 ex1)

일반화 관계는 "is a kind of 관계"에서 갤럭시 폰은 스마트폰이다. 따라서 부모 클래스는 스마트폰, 자식 클래스로 갤럭시 폰을 설정하는 것은 당연하다. 다음은 스마트폰을 설명하는 글이다.

- 스마트폰은 다른 사람과 전화와 메시지가 가능하다.

- 스마트폰은 데이터 또는 와이파이를 이용해 인터넷을 사용할 수 있다.

- 스마트폰은 앱 마켓을 통해 앱을 다운 받을 수 있다.


위 설명을 갤럭시 폰으로 대체하면 아래와 같다.

- 갤럭시 폰은 다른 사람과 전화와 메시지가 가능하다.

- 갤럭시 폰은 데이터 또는 와이파이를 이용해 인터넷을 사용할 수 있다.

- 스마트폰은 앱 마켓을 통해 앱을 다운 받을 수 있다.


부모 클래스(스마트폰)을 자식 클래스(갤럭시 폰)으로 바꿔도 전혀 문제가 없다. 즉, LSP를 만족하는 것이다. 이렇게 부모 클래스와 자식 클래스 사이에 일관성이 있으려면 최소한 부모 클래스의 인스턴스가 실행하는 해위는 자식 클래스의 인스턴스도 일관성 있게 실행할 수 있어야 한다. 이와 관련해서 밑의 예제를 보자



ex2)


public class Bag{
    private int price;
   
    public void setPrice(int price){
       this.price = price;
    }
    public int getPrice(){
       return price;
    }
}

 Bag 클래스는 가격을 설정하고 조회하는 기능이 있다. 위 클래스는 "가격은 설정된 가격 그대로 조죄된다."라는 행위를 가지고 있다. 이런 경우 Bag 클래스의 행위를 손상하지 않고 일관성 있게 실행하는 클래스를 만들려면 가장 쉬운 방법이 슈퍼 클래스에서 상속 받은 메서드들이 서브 클래스에 재정의되지 않도록 하면 된다.

public class DiscountedBag extends Bag {
   private double discountedRate = 0;
   
   public void setDiscounted(double dc){
         discountedRate = dc;
   }
   public void applyDiscount(int price){
         super.setPrice(price-(int)(discountedRate * price));
   }

위 클래스는 할인된 가격을 계산하는 기능이 추가되었고 상속 받은 메서드가 재정의 되지 않았다.

Bag b1 = new Bag(); DiscountedBag b1 = new DiscoutedBag() b1.setPrice(500); b1.setPrice(500); sysout(b1); sysout(b1);

위 코드를 보면 Bag 클래스를 DiscountedBag로 바꿔도 실행 결과가 동일하다. 즉, 일관성이 유지되 LSP가 만족된다.


public class DiscountedBag extends Bag {
   private double discountedRate = 0;
   
   public void setDiscounted(double dc){
         discountedRate = dc;
   }
   public void setPrice(int price){
         super.setPrice(price-(int)(discountedRate * price));
   }
}

만약 DiscountedBag 클래스를 위와 같이 만들면 실행 결과가 달라진다. 따라서, 일관성이 깨져 LSP를 만족하지 않고 피터 코드의 상속 규칙에서 "서브 클래스가 슈퍼 클래스의 책임을 무시하거나 재정의하지 않고 확장만 수행한다"라는 규칙에도 어긋난다. 이는 슈퍼 클래스의 메서드를 오버라이딩 하지 않는 것과 같다. 즉, 피터 코등의 상속 규칙을 지키는 것은 LSP를 만족시키는 하나의 방법이다.


+ Recent posts