리스코프 치환원칙이 무엇일까?

박승우·2024년 6월 8일


자 마흔 다섯 번째 키워드인 '리스코프 치환 원칙'을 알아 볼 것이다.

이번 키워드는 이전 키워드인 SPR처럼 SOLID원칙중 하나 이므로
직접 코드로 알아보았다.

리스코프 치환 원칙(Liskov Substitution Principle, LSP)이 뭐에요?

리스코프 치환 원칙(Liskov Substitution Principle, LSP)은 프로그램에서 하위 타입은 그것의 상위 타입으로 대체 가능해야 한다는 원칙이다.
이것은 객체 지향 프로그래밍의 다형성과 관련이 깊다고 한다.

리스코프 치환 원칙은 소프트웨어의 품질을 유지하고 확장하기 위해 중요한 역할을 한다.
이 원칙을 준수함으로써, 코드의 일관성과 예측 가능성을 유지할 수 있고, 코드의 재사용성을 높일 수 있다.

예시코드 - Unity

using UnityEngine;

// 부모 클래스
public class Character
{
    protected string name;
    protected int health;

    public Character(string name, int health) 
    {
        this.name = name;
        this.health = health;
    }

    public virtual void Move()
    {
        Debug.Log(name + " is moving.");
    }
}

// 자식 클래스
public class Player : Character
{
    public Player(string name, int health) : base(name, health)
    {
    }

    public override void Move()
    {
        Debug.Log(name + " is walking.");
    }
}

// 자식 클래스
public class Enemy : Character
{
    public Enemy(string name, int health) : base(name, health)
    {
    }

    public override void Move()
    {
        Debug.Log(name + " is chasing.");
    }
}

public class Test : MonoBehaviour
{
    void Start()
    {
        Character character1 = new Player("Hero", 100);
        character1.Move(); // 출력: Hero is walking.

        Character character2 = new Enemy("Monster", 50);
        character2.Move(); // 출력: Monster is chasing.
    }
}

코드설명

  • Character 클래스는 부모 클래스로서 게임 내의 모든 캐릭터의 공통 속성과 동작을 정의한다.
  • Player와 Enemy 클래스는 Character 클래스를 상속받아 각각의 특성에 맞게 확장된다.

리스코프 치환 원칙에 따르면, 상위 클래스(부모 클래스)의 인스턴스는 하위 클래스(자식 클래스)의 인스턴스로 대체 가능해야 한다.
즉, Character 클래스의 인스턴스는 Player 또는 Enemy 클래스의 인스턴스로 대체할 수 있어야 한다.

위의 코드에서도 Character 타입의 변수에 Player 또는 Enemy 클래스의 인스턴스를 할당하여 사용할 수 있다.
이를 통해 Player와 Enemy 클래스는 각각의 특성에 맞게 Move 메서드를 오버라이드하여 다른 동작을 수행하더라도, Character 타입으로 일반화하여 사용할 수 있다.

따라서 이러한 설계는 코드의 재사용성과 유연성을 높여주며, 소프트웨어의 유지 보수성과 확장성을 향상시킨다고 한다.

결론 - 느낀 점

은연중에 사용한 코드 스타일이 SOLID원칙을 따르고 있다는게 확인 되었다.
물론 사용하지 않는 경우도 많았지만 이 경우는 게임플레이를 구현할 때 각각의 오브젝트의
공통적인 것을을 설계할 때 사용하거나 재사용을 위해 사용했던 것 같다.

SOLID 법칙에 대해서 알아가면서 구현에 대한 설계가 어떻게 이루어 져야 하는 지 감이
잡히는 것 같다.

profile
게임을 좋아하는 사람 입니다!

0개의 댓글