본문 바로가기

Java/Methodology

[SOLID] 객체지향 설계 5원칙 - LSP

  • LSP (Liskov substitution principle)

자료형 S가 자료형 T의 하위형이라면, 프로그램에서 자료형 T의 객체는 프로그램의 속성을 변경하지 않고 자료형 S의 객체로 교체할 수 있다.

한마디로 객체는 프로그램의 정확성을 지키면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다 라는 말이다.

다형성의 관점에서 보았을 때 하위 클래스는 인터페이스 규약을 전부 지켜야지만 다형성을 지원할 수 있다.
자바에서 자식객체는 부모객체의 모든 속성을 가지고 있으며 부모객체의 확장 버전이기 때문에 가능한 속성이다.
이러한 점 때문에 필자는 상속(inheritance)라는 표현보다 확장(extend)라는 표현을 선호한다.

코드로 예를 들어보자.

public abstract class Car
{
  String manufacturer;
  String modelName;

  public abstract void run();
}

public class ElectricCar extends Car
{
  @Override
  public void run()
  {
    System.out.println("전기로 달린다.");
  }
}

public class GasolineCar extends Car
{
  @Override
  public void run()
  {
    System.out.println("휘발유로 달린다.");
  }
}

public class UseCar
{
  Car car1 = new ElectricCar();
  ElectricCar electricCar = new Car();
}

Car라는 추상 클래스가 있고 이를 구현한 ElectricCar(전기차), GasolineCar(가솔린차)가 있다.
전기차와, 가솔린차는 Car를 상속(확장)하고 있다.

Car를 사용하는 UseCar 클래스를 확인해보면
Car car1 = new ElectricCar()로 car1 인스턴스를 생성하는 것을 확인할 수 있다.

ElectricCar는 Car의 모든 속성을 가지고 있으며 Car를 확장하고 있기때문에 언제든지 하위 타입의 인스턴스로 바꿀 수 있다.