DevDino

[Unity 기술면접] interface vs abstract class 본문

Unity/기술면접

[Unity 기술면접] interface vs abstract class

데브다이노 2025. 12. 26. 14:08

"interface와 abstract 클래스는 어떤 차이가 있으며, 각각 언제 사용하는 것이 적절한가요?"

interface vs abstract class

interface : "무엇을 할 수 있는가?"(CAN-DO)

인터페이스는 클래스가 반드시 구현해야 하는 행동 규약(Contract)의 집합입니다. 구현부가 없는 메서드의 목록만을 정의하여, 서로 다른 타입의 객체들이 동일한 행동을 하도록 강제합니다. 

 

구현 강제: 반드시 구현해야 하는 약속만 정의합니다. 

다중 상속: C#에서 클래스는 단일 상속만 가능하지만, 인터페이스는 다중 상속(구현)이 가능합니다.

상태 비저장: 원칙적으로 필드(멤버 변수)를 가질 수 없습니다.

느슨한 결합: 객체 간의 결합도를 낮추어 유연한 설계를 가능하게 합니다.

 

public interface IAttackable {
    void Attack();
}
public interface IMovable {
    void Move();
}
public class Monster : IAttackable, IMovable {
    public void Attack() { Debug.Log("공격"); }
    public void Move() { Debug.Log("이동"); }
}
원칙적으로 인터페이스는 상태를 가질 수 없고 구현부가 없지만, C# 8.0 이후부터는 정적(Static) 필드와 기본 구현 메서드(Default Interface Method)를 지원합니다. 다만, 객체지향의 원칙과 코드의 복잡성 문제로 실무에서는 여전히 인터페이스에 구현을 넣는 것을 지양하는 편입니다. 

 

Abstract class : "이것의 본질은 무엇인가?" (IS-A)

abstract class(추상 클래스)는 파생 클래스들이 공유할 공통 속성 기본 로직을 묶은 기본 틀(템플릿)입니다. 공통적인 기능은 부모가 미리 구현해 두고, 세부적인 동작만 자식 클래스에서 결정하도록 위임할 때 사용합니다.

 

공통 상태 보유: 일반적인 필드(멤버 변수)를 가질 수 있습니다.

선택적 구현: 완성된 공통 메서드와 미완성된 추상 메서드를 모두 가질 수 있습니다.

단일 상속: 다른 클래스와 마찬가지로 오직 하나의 클래스만 상속받을 수 있습니다.

public abstract class Character {
    public int hp;
    public abstract void Attack();
    public void TakeDamage(int damage) { hp -= damage; }
}

public class Player : Character {
    public override void Attack() { Debug.Log("공격"); }
}

설계를 할 때는 일반적으로 인터페이스를 우선적으로 고려하는 것이 좋습니다. 상속 체계가 깊어질수록 코드가 경직되는 추상 클래스와 달리, 인터페이스는 필요한 기능만 조립하듯 사용할 수 있기 때문입니다. 

 

특히 유니티에서는 인터페이스를 활용하면 대상의 구체적인 타입은 몰라도 인터페이스를 상속받았다면 동일하게 처리할 수 있어 컴포넌트 간의 결합도를 크게 낮출 수 있습니다. 

요약
interface: 규약 / 구현 강제 / 다중 상속 가능
abstract class: 공통 틀 / 일부 구현 제공 / 단일 상속