C#

[C#] SOLID 원칙 | 리스코프 치환 원칙 (LSP)

k_min0203 2024. 8. 6. 01:00

SOLID 원칙이란?

객체지향 언어에는 SOLID 원칙이라 불리는 것이 있습니다.

SOLID원칙은 코드를 읽기 쉽고 확장하기 쉽게 만들수 있는 방침입니다.

위 원칙을 준수하지 않게 되면 코드가 복잡해져 읽거나 확장하기 어려워집니다.

 

SOLID 이름의 유래는 5가지의 원칙의 앞글자를 딴것입니다.

  • S : 단일 책임의 원칙 (Single Responsibility Principle)
  • O : 개방 폐쇄 원칙 (Open Close Principle)
  • L : 리스코프 치환의 원칙 (Liskov Subsitution)
  • I : 인터페이스 분리의 원칙 (Interface Segregation Principle)
  • D : 의존성 역전의 원칙 ( Dependency Inversion Principle)

오늘은 SOLID 원칙의 5가지 원칙중 저번에 알아보았던

개방 폐쇄 원칙에 이어서 L에 해당되는

리스코프 치환의 원칙에 대해 알아볼것입니다.

 

리스코프 치환의 원칙이란?

리스코프 치환의 원칙은 Liskov Substitution Principle 줄여서 LSP라 불리며

1988년 바바라 리스코프(Barbara Liskov)가 올바른 상속 관계의 특징을 정의하기 위해 발표한 것입니다.

 

리스코프 치환의 원칙은 다음과 같습니다.

  • 파생 클래스가 부모 클래스를 완전히 대체할 수 있어야 합니다
  • 하위 클래스는 상위 클래스의 기능을 확장할 수 있어야 합니다.

리스코프 치환의 원칙을 사용하면 하위 클래스를 유연하고 강력하게 만들수 있습니다.

 

리스코프 치환 원칙 예시

public class Vehicle
{
    public void GoFoward() { ... }
    public void GoBack() { ... }
    public void TurnRight() { ... }
    public void TurnLeft() { ... }
}

여기 Vehicle이라는 클래스가 있습니다.

 

Vehicle 클래스는 앞, 뒤로 움직이고 오른쪽, 왼쪽으로 움직이는 함수를 가지고 있습니다.

 

public class Car : Vehicle
{
    public void Move()
    {
        GoFoward();
        GoBack();
        TurnRight();
        TurnLeft();
    }
}

public class Train : Vehicle
{
    public void Move()
    {
        GoFoward();
        GoBack();
        TurnRight();
        TurnLeft();
    }
}

그리고 Vehicle을 상속받는 Car와 Train 클래스가 있습니다.

 

Car에서는 앞뒤 움직임과 양옆 회전 모두 할 수 있습니다.

 

하지만 Train에서는 앞뒤론 움직일 수 있지만 양옆으로 회전을 할 순 없습니다.

 

그러면 양옆 회전 매소드를 구현할 필요가 없어집니다.

 

이는 리스코프 치환 원칙에 위배됩니다.

 

public interface IMoveable
{
    public void GoFoward();
    public void GoBack();
}

public interface ITurnable
{
    public void GoFoward();
    public void GoBack();
}

이를 해결하기 위해 움직일 수 있는 IMoveable 인터페이스와 회전할 수 있는 ITurnable 인터페이스를 만들어줍니다.

 

이런식으로 구조를 짜게 되면 확장성이 증가함으로 나중에 코드를 확장하기 용이해집니다.

 

public class Car : IMoveable, ITurnable
{
    public void GoFoward() { ... }
    
    public void GoBack() { ... }

    public void TurnLeft() { ... }

    public void TurnRight() { ... }
}

자동차는 앞뒤 움직임, 양옆 회전 모두 할 수 있으므로 IMoveable, ITurnable 인터페이스를 모두 상속받아줍니다.

 

public class Train : IMoveable
{
    public void GoFoward() { ... }

    public void GoBack() { ... }
}

기차는 앞뒤 움직임만 할 수 있으므로 IMoveable 인터페이스만 상속시켜줍니다.

 

이렇게 되면 리스코프 치환 원칙에위배되지 않을수 있습니다.

 

다른 SOLID 원칙 글 보러가기

 단일 책임 원칙 (SRP)

2024.07.25 - [C#] - [C#] SOLID 원칙 | 단일 책임 원칙 (SRP)

 

[C#] SOLID 원칙 | 단일 책임 원칙 (SRP)

SOLID 원칙이란?객체지향 언어에는 SOLID 원칙이라 불리는 것이 있습니다.SOLID원칙은 코드를 읽기 쉽고 확장하기 쉽게 만들수 있는 방침입니다.위 원칙을 준수하지 않게 되면 코드가 복잡해져 읽거

min0203.tistory.com

 

개방 폐쇄의 원칙 (OCP)

 

2024.07.27 - [C#] - [C#] SOLID 원칙 | 개방 폐쇄의 원칙 (OCP)

 

[C#] SOLID 원칙 | 개방 폐쇄의 원칙 (OCP)

SOLID 원칙이란?객체지향 언어에는 SOLID 원칙이라 불리는 것이 있습니다.SOLID원칙은 코드를 읽기 쉽고 확장하기 쉽게 만들수 있는 방침입니다.위 원칙을 준수하지 않게 되면 코드가 복잡해져 읽거

min0203.tistory.com

 

참고한 자료

https://www.youtube.com/watch?v=J6F8plGUqv8&t=1021s