ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 9장 - LSP: 리스코프 치환 원칙
    클린 코드(Clean Code)/클린 아키텍처요약 2022. 11. 25. 00:01
    728x90

    리스코프 치환 원칙

    간단하게 인터페이스 하나를 두고 2개의 구현 클래스가 o1, o2가 존재할 때 o2자리에 o1을 치환하더라도 행위가 변하지 않아야 합니다.

     

    인터페이스와 상속

    License라는 인터페이스가 존재하며 calcFee라는 메서드를 가집니다.

    이때 PersonalLicense와 BusinessLicense라는 2가지의 License 인터페이스를 구현하는 클래스가 존재합니다.

    두 클래스는 서로 다른 알고리즘을 이용해서 라이선스 비용을 계산합니다.

     

    이때 프로그램이 License 인터페이스에 의존하고 있다면 이들 하위 타입 중 무엇을 사용하는지는 중요하지 않습니다.

     

    정사각형/직사각형 문제 : LSP 위반

    정사각형은 직사각형의 하위 타입으로는 적절하지 않습니다.

    직사각형은 높이와 너비가 서로 독립적인 반면에 정사각형의 높이와 너비는 항상 같이 변경됩니다.

     

    이때 프로그램이 직사각형에 의존적인 상황에서 정사각형 구현 클래스를 만들게 되면 문제가 발생합니다.

    Rectangle r = ...
    r.setWidth(2);
    r.setHeight(5);
    assert(r.area() == 10);

     

    이 코드에서 정사각형을 생성하게 된다면 assert문을 실패하게 됩니다.

    이런 형태의 LSP 위반을 막기 위해서는 if문 등을 추가해서 직사각형이 정사각형인지 추가하는 코드를 프로그램에 추가해야 합니다.

     

    유사하게 택시 파견 서비스 사례에서도 두 회사의 인터페이스가 치환 가능하지 않다면 if문을 추가해야 하며 또 다른 회사가 들어오게 되었을 때 인터페이스를 지키지 않는다면 또 다른 if문이 추가됨을 시사합니다.

     

    즉, 인터페이스가 서로 치환 가능하지 않다는 사실을 처리하는 중요하고 복잡한 메커니즘을 추가하게 됩니다.

     

    LSP의 변화

    초창기에서는 상속을 사용하도록 가이드하는 방법 정도로 간주되었습니다.

    하지만 시간이 지나면서 LSP는 인터페이스와 구현체에도 적용되는 더 광범위한 소프트웨어 설계 원칙으로 변모해 왔습니다.

    잘 정의된 인터페이스와 그 인터페이스의 구현체끼리의 상호 치환 가능성에 기대는 사용자들이 존재합니다.

     

     

     

    댓글

Designed by Tistory.