-
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. 유의사항
- 추상 클래스는 '가족 관계'를 만드는 거라 신중해야 함. 한 번 상속받으면 다른 클래스를 상속받을 수 없기 때문임.
- 인터페이스는 '계약'임. 어떤 클래스든 인터페이스만 갖다 붙이면 그 기능을 수행할 수 있게 되어 코드가 매우 유연해짐.
- 유의할 점: 인터페이스에는 변수(필드)를 선언할 수 없어서, 데이터를 저장해야 한다면 반드시 추상 클래스나 일반 클래스를 써야 함.
'다시한번 개발자도전!' 카테고리의 다른 글
Unity | 리지드바디(Rigidbody)와 콜라이더(collider)의 관계 (0) 2026.01.20 Unity | 콜라이더(Collider)와 충돌(collision) (0) 2026.01.20 Unity | 다형성(Polymorphism) 이란? (0) 2026.01.14 다시한번 개발자도전! 9일차 (상속, 캐스팅,base,오버라이딩) (0) 2026.01.14 OOP 4대 원칙과 SOLID 5대 원칙 (0) 2026.01.13