Unity/C# 개발 노트

SOLID 원칙: 리스코프 치환 원칙 (LSP) - C# 예제로 이해하기

WithChan 2025. 3. 24. 07:25
728x90
반응형

SOLID 원칙: 리스코프 치환 원칙 (LSP)

LSP란 무엇인가?

리스코프 치환 원칙(Liskov Substitution Principle, LSP)은 SOLID 원칙 중 하나로, 서브타입은 언제나 기반(부모) 타입으로 교체할 수 있어야 한다는 원칙입니다. 이는 다형성의 핵심을 이루며, 부모 클래스의 인스턴스를 사용하듯이 자식 클래스를 사용할 수 있어야 함을 의미합니다.

한 줄 요약: LSP를 준수하면 객체를 부모 클래스 타입으로 선언해도 자식 클래스의 인스턴스를 올바르게 사용할 수 있습니다.

예제 코드로 이해하기

아래는 Unity C# 환경에서 LSP 원칙을 활용한 간단한 예제입니다. 이 예제에서는 기본 `Bird` 클래스와 이를 상속한 `FlyingBird`와 `Penguin` 클래스를 통해 LSP의 적용 가능성을 보여줍니다.

public class Bird

{

    public virtual void Fly()

    {

        Console.WriteLine("Flying...");

    }

}



public class FlyingBird : Bird

{

    public override void Fly()

    {

        Console.WriteLine("Flying high in the sky!");

    }

}



public class Penguin : Bird

{

    public override void Fly()

    {

         throw new InvalidOperationException("Penguins cannot fly!");

    }

}



public class BirdTest

{

    public void TestBirds()

    {

        List birds = new List();

        birds.Add(new FlyingBird());

        birds.Add(new Penguin());



        foreach (var bird in birds)

        {

            bird.Fly();

        }

    }

}
⚠️ 주의: 이 예제는 LSP 원칙을 위반하고 있습니다. `Penguin`은 `Fly` 메서드에 예외를 던지는 것으로, 모든 `Bird` 객체가 날아야 한다는 전제를 깨뜨립니다.

LSP를 올바르게 준수하는 방법

위의 문제를 해결하려면, `Fly` 메서드가 모든 `Bird`에서 호출되는 것을 방지해야 합니다. 대신, 각 클래스에 맞는 행동을 정의하는 것은 어떻게 하는지 알아보겠습니다.

public class Bird { }



public interface IFlyable

{

    void Fly();

}



public class FlyingBird : Bird, IFlyable

{

    public void Fly()

    {

        Console.WriteLine("Flying high in the sky!");

    }

}



public class Penguin : Bird { }



public class BirdTest

{

    public void TestBirds()

    {

        List<Bird> birds = new List<Bird>();

        birds.Add(new FlyingBird());

        birds.Add(new Penguin());



        foreach (var bird in birds)

        {

            if (bird is IFlyable flyableBird)

            {

                flyableBird.Fly();

            }

        }

    }

}
Tip: 인터페이스 분리를 통해 각 클래스가 자신의 행위를 명확히 하도록 구조를 변경하면 개방-폐쇄 원칙에도 부합합니다.
728x90
반응형
LIST