2024-06-18

소프트웨어 설계에서 지켜야 할 다섯 가지 핵심 원칙
유연하고 관리하기 쉬운 객체 지향 설계를 추구하기 위해 사용된다.
리스코프 치환 법칙 (LSP) : 자식 클래스의 인스턴스는 그 부모 클래스의 객체로 치환 가능해야 한다는 원칙이다.
즉, 부모 클래스의 인스턴스를 사용하는 부분에 자식 클래스의 인스턴스를 사용해도 프로그램의 동작이 변하지 않아야 한다.
Bird 클래스 : Fly( ) , Cry( )
Bird 클래스의 자식 클래스 : Sparrow, Penguin
public class Bird : Monobehaviour
{
public void Cry()
{
Debug.Log("새가 지저귄다.");
}
public void Fly()
{
Debug.Log("새가 날아간다.);
}
}
public class Sparrow : Bird
{
pubic override void Cry()
{
Debug.Log("참새 짹짹");
}
public override void Fly()
{
Debug.Log("참새가 날아간다.");
}
}
public class Penguin : Bird
{
public override void Cry()
{
Debug.Log("펭귄 꽥꽥");
}
public override void Fly()
{
throw new Exception("펭귄은 날 수 없다.");
}
}
public static void Main()
{
Bird sparrow = new Sparrow();
Bird penguin = new Penguin();
sparrow.Fly(); // "참새가 날아간다"
penguin.Fly(); // 예외 발생 : "펭귄은 날 수 없다."
}
Penguin 클래스가 Bird 클래스를 상속 받았지만, Fly 메서드를 오버라이드하여 예외가 발생했다.
부모 클래스의 인스턴스 (penguin) 를 자식 클래스의 인스턴스로 대체할 때, 문제가 발생했기 때문이다.
Bird 클래스 : Cry( )
Bird 클래스의 자식 클래스 : FlyBird , FlightlessBird
FlyBird 클래스의 인스턴스 : sparrow
FlightlessBird 클래스의 인스턴스 : penguin
public class Bird : Monobehaviour
{
public void Cry()
{
Debug.Log("새가 지저귄다.");
}
}
public class FlyBird : Bird
{
public override void Fly()
{
Debug.Log("새가 날아간다.");
}
}
public class FlightlessBird : Bird
{
public override void Run()
{
Debug.Log("새가 뛴다.");
}
}
public static void Main()
{
Bird sparrow = new FlyBird();
Bird penguin = new FlightlessBird();
sparrow.Fly(); // "새가 날아간다."
penguin.Fly(); // 아무 출력 없음
}
LSP 를 준수하였기 때문에, Bird 클래스의 인스턴스가 사용하는 코드가 FlyBird 와 FlightlessBird 로 대체되어도 문제없이 작동된다.
부모 클래스의 행동 규약을 자식 클래스가 위반하면 안 된다.
행동 규약을 위반한다는 것은 자식 클래스가 오버라이딩 할 때, 잘못 재정의 하면 리스코프 치환 원칙을 위배할 수 있다는 의미이다.
SOLID 원칙의 L 리스코프 치환 법칙을 살펴보았다.
최근 FSM 디자인 패턴 강의를 들으며, 너무 어렵게 느껴졌다.
이전에 SOLID 원칙 강의를 들은 것을 떠올리며, 하나씩 차근차근 익혀 가야겠다고 생각했다.