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