객체 지향 프로그래밍 개념 – 객체 지향 설계 원칙 (SOLID 원칙) – 2 – LSP (Liskov Substitution Principle)

객체 지향 프로그래밍 개념 - 객체 지향 설계 원칙 (SOLID 원칙) - 2 - LSP (Liskov Substitution Principle)
객체 지향 프로그래밍 개념 – 객체 지향 설계 원칙 (SOLID 원칙) – 2 – LSP (Liskov Substitution Principle)

객체 지향 프로그래밍 개념 – 객체 지향 설계 원칙 (SOLID 원칙) – 2 – LSP (Liskov Substitution Principle)

소제목: LSP란 무엇인가?

LSP(리스코프 치환 원칙)는 객체 지향 설계 원칙(SOLID 원칙) 중 하나로, 자식 클래스는 언제나 부모 클래스로 대체될 수 있어야 한다는 원칙입니다. 즉, 상속 관계에서 부모 클래스의 인스턴스를 자식 클래스의 인스턴스로 대체해도 프로그램의 기능, 동작, 정확성이 변하지 않아야 한다는 것을 의미합니다. 이 원칙은 자식 클래스가 부모 클래스의 기능을 정확하게 이해하고 확장하는 것을 요구합니다.

예시: 도형 클래스의 상속 관계

예를 들어, 도형을 표현하는 클래스들이 상속 관계를 가지고 있다고 가정해봅시다. 부모 클래스로는 ‘도형’ 클래스가 있고, 이를 상속받은 자식 클래스로 ‘원’, ‘사각형’, ‘삼각형’ 클래스가 있습니다. 각 클래스는 도형의 면적을 계산하는 계산면적() 메서드를 가지고 있습니다.

이때, LSP를 준수하기 위해서는 자식 클래스가 부모 클래스로 대체되어도 계산 결과가 변하지 않아야 합니다. 즉, 다음과 같은 코드가 유효해야 합니다:

도형 도형1 = new 원();
도형 도형2 = new 사각형();
도형 도형3 = new 삼각형();

도형1.계산면적(); // 원의 면적 계산
도형2.계산면적(); // 사각형의 면적 계산
도형3.계산면적(); // 삼각형의 면적 계산

비유적인 표현으로 이해하기

비유적으로 말하자면, LSP는 부모와 자식 간의 관계가 마치 쉽게 서로 대체할 수 있는 사이의 관계인 마법사와 학생의 관계와 비슷합니다. 부모 클래스는 마법사이며, 자식 클래스는 학생입니다. 학생은 마법사가 가진 마법을 사용할 수 있어야 합니다. 그러나 학생이 마법을 사용하면서 새로운 마법을 추가하거나 원래의 마법을 변형할 필요는 없습니다. 학생은 그저 마법사가 제공한 마법을 올바르게 사용할 수 있어야 합니다.

LSP 준수를 위한 설계 원칙

LSP를 준수하기 위해서는 몇 가지 설계 원칙을 따라야 합니다.

  1. 부모 클래스와 자식 클래스는 같은 계약(Contract)을 따라야 합니다. 이는 부모 클래스에서 정의한 메서드 시그니처, 예외 처리 방법, 사전/사후 조건 등을 자식 클래스에서 준수해야 함을 의미합니다.
  2. 자식 클래스는 부모 클래스의 기능을 오버라이드하지 않고 확장해야 합니다. 즉, 자식 클래스에서 새로운 기능을 추가할 수 있지만, 부모 클래스의 기능을 변경하거나 무시해서는 안 됩니다.
  3. 자식 클래스는 부모 클래스가 지정한 제약 조건을 더 강화해서는 안 됩니다. 즉, 부모 클래스의 사전 조건(Precondition)을 완화하거나 사후 조건(Postcondition)을 강화해서는 안 됩니다.
  4. 자식 클래스는 부모 클래스에서 정의한 예외를 발생시키지 않거나, 더 적은 예외만 발생시켜야 합니다. 즉, 자식 클래스는 부모 클래스에서 정의한 예외를 무시하지 않고 적절하게 처리해야 합니다.

LSP 주의해야 할 점

LSP를 제대로 준수하지 않으면 다음과 같은 문제가 발생할 수 있습니다.

  1. 논리적인 오류: 자식 클래스가 부모 클래스의 기능을 변경하거나 무시하면, 예상치 못한 동작이 발생할 수 있습니다. 이는 시스템 전체의 논리적인 일관성을 해치게 됩니다.
  2. 유지보수의 어려움: LSP를 지키지 않은 코드는 유지보수하기 어렵습니다. 예를 들어, 부모 클래스의 변경으로 인해 자식 클래스의 코드를 수정해야 한다면, 이는 LSP를 제대로 따르지 않은 결과입니다.
  3. 확장성의 제한: LSP를 준수하지 않은 설계는 확장성이 떨어지며, 새로운 자식 클래스를 추가하는 등의 변경이 어려워집니다. 이는 객체 지향 프로그래밍의 장점인 유연성과 재사용성을 저해합니다.

마무리

LSP(리스코프 치환 원칙)은 객체 지향 설계 원칙(SOLID 원칙) 중 하나로, 자식 클래스는 부모 클래스로 대체 가능해야 합니다. 이를 위해서는 부모와 자식 간의 계약을 준수하고, 부모 클래스의 기능을 오버라이드하지 않고 확장해야 합니다. 또한, 예외 처리와 제약 조건에도 신경을 써야 합니다.

LSP를 준수하면 논리적인 오류를 방지하고, 유지보수성을 향상시키며, 시스템의 확장성을 높일 수 있습니다. 따라서 LSP는 객체 지향 프로그래밍에서 중요한 원칙 중 하나이며, 이를 준수하는 설계와 개발을 지향해야 합니다.

이와 같이 LSP에 대해 알아보았습니다. 자세한 내용은 블로그에서 확인하실 수 있으며, 객체 지향 프로그래밍과 SOLID 원칙에 대한 이해를 더욱 확장하시기 바랍니다.

감사합니다!

주의해야 할 점 요약

  • 자식 클래스는 부모 클래스로 대체 가능해야 한다.
  • 계약(Contract)을 따르고, 기능을 오버라이드하지 않고 확장해야 한다.
  • 제약 조건을 강화하거나 예외를 적게 발생시켜야 한다.
  • LSP를 준수하지 않으면 논리적 오류, 유지보수 어려움, 확장성 제한 등의 문제가 발생할 수 있다.

답글 남기기