ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Unity | 추상클래스 (Abstract Class)와 인터페이스(Interface)
    다시한번 개발자도전! 2026. 1. 15. 15:57

    < 추상 클래스(Abstract Class) >

    1 - 1. 정의

    • 추상 클래스는 단어 그대로 추상적인 개념만 담고 있는 클래스.
    • 예를 들어 '동물'이라는 객체는 세상에 존재하지 않음. 사자, 토끼, 강아지 같은 '실체'만 존재할 뿐. 이때 '동물'처럼 실체들의 공통점만 모아놓은 가이드라인이 바로 추상 클래스.
    • 핵심: 스스로 객체(Instance)를 생성할 수 없음 (new 키워드 사용 안 됨).
    • 목적: 상속받는 자식 클래스들이 특정 기능을 반드시 구현하도록 강제하고, 공통된 기능을 물려주는 것임.

    1 - 2. 사용법 

    C#에서 abstract 키워드를 클래스와 메서드 앞에 붙여서 사용함.

    public abstract class Enemy : MonoBehaviour //부모 추상클래스
    {
        public float hp = 100f; 
    
        public void TakeDamage(float damage)
        {
            Debug.Log("데미지 입음!");
        }
    
        // 추상 메서드: "공격 방식은 자식이 직접 구현해야함 (필수!)"
        public abstract void Attack(); 
    }
    
    
    public class Orc : Enemy //자식클래스
    {
        // 추상 메서드는 반드시 override해서 완성해야 함
        public override void Attack()
        {
            Debug.Log("도끼로 강하게 내리찍기!");
        }
    }

     

     

     

    • 추상 메서드는 선언만 함: public abstract void Move(); 처럼 세미콜론으로 끝내고 중괄호({ })를 쓰지 않음.
    • 강제성: 추상 클래스를 상속받은 자식 클래스는 부모의 추상 메서드를 무조건 구현해야 컴파일 에러가 안 남.
    • 일반 멤버 포함: 인터페이스(Interface)와 가장 큰 차이점임. 변수, 프로퍼티, 일반 메서드를 가질 수 있어서 코드 중복을 줄이는 데 매우 효율적임.

    < 인터페이스(Interface) >

    2 - 1. 정의

    "이 기능을 할 수 있음(Capability)"을 정의하는 '규약'이나 '자격증' 같은 느낌.

    • 특징: I로 시작하는 이름을 가짐 (예: IDamageable, IInteractable).
    • 사용법: 메서드, 프로퍼티의 선언만 있고 구현부는 없음. (C# 최신 버전에서는 기본 구현이 가능하지만 보통 선언 위주로 씀)
    • 다중 상속: 클래스와 달리 여러 개를 한 번에 상속(구현)받을 수 있음.

    2 - 2. 인터페이스 구현 (상속받기)

    클래스에서 인터페이스를 상속받으면, 그 안에 정의된 메서드를 무조건 구현해야 함.

    public interface IDamageable
    {
        // 오직 메서드, 프로퍼티, 이벤트의 선언만 가능함.
        void TakeDamage(float damage);
        float CurrentHealth { get; }
    }
    
    public class Player : MonoBehaviour, IDamageable
    {
        public float health = 100f;
    
        // 인터페이스의 프로퍼티 구현
        public float CurrentHealth => health;
    
        // 인터페이스의 메서드 구현 (override 키워드는 안 씀)
        public void TakeDamage(float damage)
        {
            health -= damage;
            Debug.Log("플레이어가 데미지를 입음!");
        }
    }

    2 - 3. 다중상속

    // 클래스 이름 뒤에 콤마(,)로 구분해서 여러 개 적으면 됨
    public class Player : MonoBehaviour, IDamageable, IInteractable
    {
      //코드구현
    }

     

     

    • 클래스 간의 결합도를 낮출 수 있음. 객체의 정체성(Identity)에 얽매이지 않고, 필요한 기능만 골라서 장착할 수 있다는 게 최대 장점임.
    • 기능을 잘게 쪼개서 인터페이스로 만들어두면, 나중에 새로운 클래스를 만들 때 조립하듯이 코딩할 수 있음.

    < 추상클래스 (Abstract Class)와 인터페이스(Interface)의 차이 >

    3 - 1. 비교 표

    구분 추상 클래스 (Abstract Class) 인터페이스 (Interface)
    핵심 개념 Is-A (~는 ~이다) Can-Do (~를 할 수 있다)
    상속 단일 상속만 가능 (하나만 선택) 다중 상속 가능 (여러 개 장착)
    구성 요소 변수, 일반 메서드, 추상 메서드 포함 가능 오직 메서드, 프로퍼티의 선언만 (기본)
    접근 제어자 public, protected 등 사용 가능 기본적으로 전부 public
    사용 목적 공통된 조상으로서 유전자를 물려줄 때 서로 다른 종류들이 공통 기능을 가질 때

    3 - 2.  유의사항

    • 추상 클래스는 '가족 관계'를 만드는 거라 신중해야 함. 한 번 상속받으면 다른 클래스를 상속받을 수 없기 때문임.
    • 인터페이스는 '계약'임. 어떤 클래스든 인터페이스만 갖다 붙이면 그 기능을 수행할 수 있게 되어 코드가 매우 유연해짐.
    • 유의할 점: 인터페이스에는 변수(필드)를 선언할 수 없어서, 데이터를 저장해야 한다면 반드시 추상 클래스나 일반 클래스를 써야 함.
Designed by Tistory.