인터페이스 분리원칙이 무엇일까?

박승우·2024년 6월 8일
post-thumbnail

자 마흔 세 번째 키워드인 '인터페이스 분리원칙'을 알아 볼 것이다.

우선 이것을 알기위해 인터페이스를 사용하는 이유부터 알아보았으며
SOLID원칙중 한개인 인터페이스 분리원칙을 알고 예시코드도 알아보았다.

인터페이스를 사용하는 이유가 뭐에요


사용하는 이유

  1. 유연성 향상

    인터페이스를 사용하면 코드의 유연성이 증가한다. 서로 다른 클래스들이 동일한 인터페이스 를 구현함으로써 교체 가능성이 높아진다. 이는 의존성 주입, 전략 패턴 등의 디자인 패턴을 쉽게 적용할 수 있게 한다고 한다.

  2. 코드의 재사용성 증가

    인터페이스를 통해 기능을 정의하고 여러 클래스에서 이를 구현하게 하면, 코드의 재사용성을 높일 수 있다. 동일한 기능을 다양한 방식으로 구현할 수 있게 해준다.

  3. 의존성 감소

    클래스가 구체적인 구현 클래스가 아닌 인터페이스에 의존하도록 하면, 구현 변경 시 영향을 받는 범위가 줄어든다. 이는 코드의 유지보수성을 높인다.

  4. 다형성 지원

    인터페이스를 통해 다형성을 지원한다. 하나의 인터페이스 타입 변수를 사용해 여러 다른 구 현체 객체를 사용할 수 있게 되어, 코드를 보다 유연하게 작성할 수 있다.

인터페이스 분리원칙이 뭐에요


인터페이스 분리 원칙은 SOLID 원칙 중 하나로, 클라이언트가 자신이 사용하지 않는 메서드에 의존하지 않도록 인터페이스를 분리하라는 원칙이다.
이를 통해 시스템을 더 유연하고 이해하기 쉽게 만들 수 있고 위에 사용한 이유처럼 장점을
극대화 할 수 있다고 한다.

ISP : Interface Segregation Principle 주요내용

  1. 작고 명확한 인터페이스

    하나의 큰 인터페이스보다는 여러 개의 작고 명확한 인터페이스로 나누는 것이 좋다.
    각 인터페이스는 특정 클라이언트의 요구 사항에 맞춘 기능만을 제공하게 된다.

  2. 사용하지 않는 기능의 의존성 제거

    클라이언트가 사용하지 않는 메서드에 대한 의존성을 제거함으로써, 불필요한 변경으로 인한 영향을 최소화할 수 있다.

  3. 변경에 대한 영향을 줄임

    인터페이스가 작고 구체적이기 때문에, 인터페이스의 변경이 필요한 경우 해당 인터페이스를 구현한 클래스에만 영향을 미친다. 다른 인터페이스와 그 구현체에는 영향을 주지 않는다.

예시 코드 - Unity

  • Interface
public interface IAttackable
{
    void Attack();
}

public interface IMovable
{
    void Move();
}

public interface IDamageable
{
    void TakeDamage(int amount);
}
  • Player, Enemy, NPC Class
public class Player : MonoBehaviour, IAttackable, IMovable, IDamageable
{
    public void Attack()
    {
        // 플레이어의 공격 로직
        Debug.Log("Player attacks!");
    }

    public void Move()
    {
        // 플레이어의 이동 로직
        Debug.Log("Player moves!");
    }

    public void TakeDamage(int amount)
    {
        // 플레이어가 데미지를 받는 로직
        Debug.Log("Player takes damage: " + amount);
    }
}

public class Enemy : MonoBehaviour, IAttackable, IDamageable
{
    public void Attack()
    {
        // 적의 공격 로직
        Debug.Log("Enemy attacks!");
    }

    public void TakeDamage(int amount)
    {
        // 적이 데미지를 받는 로직
        Debug.Log("Enemy takes damage: " + amount);
    }
}

public class NPC : MonoBehaviour, IMovable
{
    public void Move()
    {
        // NPC의 이동 로직
        Debug.Log("NPC moves!");
    }
}

위 사진을 코드로 구현한 예시 코드이다.

3개의 인터페이스를 각 클래스에 필요한 인터페이스만 상속을 받았다.

IAttackable, IMovable, IDamageable로 인터페이스를 분리함으로써 각 클래스가 필요한 기능만을 구현하도록 작성했다.

Player 클래스는 모든 인터페이스를 구현하고, Enemy 클래스는 공격과 데미지 관련 인터페이스만, NPC 클래스는 이동 관련 인터페이스만 구현했다.

인터페이스를 적절히 분리하고 활용하면, 게임 코드의 유연성, 유지보수성, 재사용성을 크게 향상시킬 수 있다고 한다.

결론 - 느낀 점

OOP 5원칙을 어느정도 알고 있었지만 이렇게 코드로 직접작성해보며 알아본 적은 처음이다.
물론 게임을 개발할 때 인터페이스를 사용하여 각 기능별로 구현하여 사용한 적은 있지만
더욱 구조를 설계할 때 고려를 많이 해야 할 것 같다.

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

0개의 댓글