본문 바로가기
C#

C# 의 Interface 기초부터 활용까지

by Oz Driver 2025. 6. 26.

 

C#에서 인터페이스는 단순한 “기능 명세서”가 아닙니다.
코드 구조를 유연하게 만들고, 클래스 간 결합을 줄이며, 특정 기능을 가진 객체들을 하나의 타입으로 다룰 수 있게 해줍니다.

인터페이스란?

인터페이스는 클래스나 구조체가 구현해야 할 기능만 정의하는 “타입”입니다.

public interface IUsable 
{ 
    void Use(); 
}

 

 

이름 앞에 I를 붙이는 것이 관례 (IUsable, IDamageable 등)

public을 붙이지 않으면 같은 파일 안에서만 보임 (internal이 기본임)

인터페이스를 다른 클래스나 다른 파일에서도 써야 하므로 명시적으로 public 을 붙여주는 것이 가독성 면에서 좋습니다.

 

왜 인터페이스가 필요한가?

다양한 객체들이 동일한 기능을 제공하지만,
그 구현 방식은 서로 다를 때 인터페이스가 빛납니다.

 

실전 예제: 아이템 시스템

 
public class Item 
{ 
    public string Name { get; set; } 
    public Item(string name) => Name = name; 
}
 
 

어떤 아이템은 사용 가능하고, 어떤 아이템은 장착만 가능하다면?

 
public class Potion : Item, IUsable 
{ 
    public Potion(string name) : base(name) 
    { 
    } 
    
    public void Use() 
    { 
        Console.WriteLine($"{Name}을(를) 사용했습니다!"); 
    } 
} 

public class Sword : Item 
{ 
    public Sword(string name) : base(name) 
    { 
    } 

    // IUsable 아님. 사용 불가 
}

타입 검사 – is 와 as

인터페이스도 클래스처럼 정식 타입입니다.
따라서 is로 타입을 확인하거나, as로 안전하게 형변환할 수 있습니다.

List<Item> inventory = new List<Item> 
{ 
    new Potion("체력 포션"), 
    new Sword("강철 검"), 
    new Potion("마나 포션") 
}; 

foreach (var item in inventory) 
{ 
    Console.WriteLine($"아이템: {item.Name}"); 
    
    if (item is IUsable usable) 
    { 
        usable.Use(); 
    } 
}
 

✔ is는 타입 확인 + 변수 선언까지 가능
✔ as는 형변환 시도 → 실패하면 null 반환 (예외 없음)

var usable = item as IUsable;

if (usable != null) 
    usable.Use();

 

인터페이스도 “타입”이다

C#에서 타입은 클래스뿐 아니라 구조체, 배열, 델리게이트, 열거형, 인터페이스까지 포함됩니다.

종류예시설명
클래스 class Player {} 참조형 타입
구조체 struct Vector3 {} 값 타입
인터페이스 interface IDamageable {} 기능 명세 타입
배열 int[], string[] 타입 기반 컬렉션
델리게이트 delegate void Callback() 함수 타입
열거형 enum Direction {} 정수 집합 타입
 

 

클래스 상속 + 인터페이스 구현 순서

C#에서는 클래스는 하나만 상속할 수 있지만,
인터페이스는 여러 개 구현할 수 있습니다.

public class Player : MonoBehaviour, IDamageable, IUsable
{
    public void TakeDamage(int amount)
    {
        Console.WriteLine($"플레이어가 {amount} 피해를 입었습니다.");
    }

    public void Use()
    {
        Console.WriteLine("플레이어가 아이템을 사용했습니다.");
    }
}

 

주의:

  • 클래스 상속은 항상 제일 앞에
  • 인터페이스는 쉼표로 여러 개 나열
  • 순서가 틀리면 컴파일 에러

 

Unity에서도 자주 쓰인다

Unity에서는 다음과 같은 코드가 자주 등장합니다:

csharp
복사편집
var comp = GetComponent<MonoBehaviour>(); if (comp is IDamageable damageable) { damageable.TakeDamage(10); }

✔ 여기서 IDamageable도 타입
✔ is로 안전하게 검사하고, 패턴 매칭으로 바로 변수 선언


✅ 정리

  • 인터페이스는 기능만 정의하고, 클래스가 구현
  • interface 선언에는 보통 public을 붙여야 다른 클래스에서 구현 가능
  • 클래스 상속은 1개, 인터페이스는 여러 개 가능
  • is는 타입 확인, as는 안전한 형변환
  • Unity에서도 자주 쓰이며, 구조가 깔끔한 코드의 핵심

인터페이스는 타입이다.
is와 as는 그 타입을 안전하게 검사하고 사용하는 도구일 뿐이다.