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는 그 타입을 안전하게 검사하고 사용하는 도구일 뿐이다.
'C#' 카테고리의 다른 글
C#의 is 와 as 키워드 (#02) (0) | 2025.06.26 |
---|---|
C#의 is 와 as 키워드 (#01) (0) | 2025.06.26 |
C# 의 상속이 C++ 과 다른 점 (0) | 2025.06.25 |
=> 에 대한 진실과 오해 : 이것은 람다일까 아닐까? (0) | 2025.06.23 |
C# 다형성(Polymorphism) 정리 (0) | 2025.06.23 |