[TIL] 디자인 패턴 - SOLID (L)

MINO·2024년 6월 18일
0
post-thumbnail

2024-06-18

참고한 Unity Blog


SOLID 원칙

소프트웨어 설계에서 지켜야 할 다섯 가지 핵심 원칙

유연하고 관리하기 쉬운 객체 지향 설계를 추구하기 위해 사용된다.


Liskov Substitution

리스코프 치환 법칙 (LSP) : 자식 클래스의 인스턴스는 그 부모 클래스의 객체로 치환 가능해야 한다는 원칙이다.

즉, 부모 클래스의 인스턴스를 사용하는 부분에 자식 클래스의 인스턴스를 사용해도 프로그램의 동작이 변하지 않아야 한다.


왜?

  • 코드의 유연성과 재사용성을 높이기 위해 사용
    • 부모 클래스의 인스턴스를 사용하는 코드에서 자식 클래스의 인스턴스를 대체하여 사용할 수 있다.
  • 인터페이스와 다형성의 활용
    • 부모 클래스의 인터페이스를 구현하는 자식 클래스는 동일한 방식으로 동작해야 하므로, 자식 클래스들이 동일한 인터페이스를 통해 일관된 동작을 보장할 수 있다.

예시

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) 를 자식 클래스의 인스턴스로 대체할 때, 문제가 발생했기 때문이다.


LSP 를 지킨 코드

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 로 대체되어도 문제없이 작동된다.


정리

부모 클래스의 행동 규약을 자식 클래스가 위반하면 안 된다.

행동 규약을 위반한다는 것은 자식 클래스가 오버라이딩 할 때, 잘못 재정의 하면 리스코프 치환 원칙을 위배할 수 있다는 의미이다.

TIL 마무리

SOLID 원칙의 L 리스코프 치환 법칙을 살펴보았다.

최근 FSM 디자인 패턴 강의를 들으며, 너무 어렵게 느껴졌다.

이전에 SOLID 원칙 강의를 들은 것을 떠올리며, 하나씩 차근차근 익혀 가야겠다고 생각했다.

profile
안녕하세요 게임 개발하는 MINO 입니다.

0개의 댓글