✅ 클래스 상속 (Inheritance)
✔️ 정의
class A : B처럼, 한 클래스가 다른 클래스의 기능을 물려받는 것
✔️ 목적
- 코드 재사용: 부모 클래스의 멤버(필드, 메서드 등)를 자식이 그대로 사용 가능
- 기능 확장: 자식 클래스는 새로운 기능을 추가하거나, 부모 기능을 재정의 가능
- 다형성(polymorphism): 부모 타입으로 자식 객체를 다룰 수 있음
✔️ 예제
class Character
{
public virtual void Attack()
{
Console.WriteLine("기본 공격!");
}
}
class Warrior : Character
{
public override void Attack()
{
Console.WriteLine("칼 휘두르기!");
}
}
Character c = new Warrior();
c.Attack(); // 출력: 칼 휘두르기!
➡️ 부모 타입으로 자식 인스턴스를 다룰 수 있다 = 다형성
⚠️ 단점
- 단일 상속만 가능: 부모는 한 명만
- 상속 깊이가 깊어지면 유지보수가 어려워짐
- 상속 관계가 강한 결합을 만들 수 있음 (부모 변경 시 자식에 영향 큼)
✅ 인터페이스 (Interface)
✔️ 정의
interface IAttackable처럼, 기능의 "약속"만 정의하는 타입
→ 구현 없이 메서드 시그니처만 선언
→ 구현은 클래스에서 직접 해야 함
✔️ 목적
- 다형성 지원: 특정 인터페이스를 구현한 객체들을 동일하게 다룸
- 의존성 분리: 구체 타입보다 "역할"에 의존
- 다중 상속 가능: 하나의 클래스가 여러 인터페이스를 동시에 구현 가능
✔️ 예제
interface IAttackable
{
void Attack();
}
class Archer : IAttackable
{
public void Attack()
{
Console.WriteLine("화살 발사!");
}
}
IAttackable a = new Archer();
a.Attack(); // 출력: 화살 발사!
➡️ 누구든 IAttackable만 구현하면 같은 방식으로 다룰 수 있음 → 유연함, 약한 결합
✅ 클래스 상속 vs 인터페이스 정리
항목 | 클래스 상속 | 인터페이스 |
목적 | 기능 물려주기 (재사용) | 역할 정의 (규칙 강제) |
코드 재사용 | ✅ 가능 | ❌ 없음 (직접 구현 필요) |
다중 상속 | ❌ 안 됨 | ✅ 가능 |
구현 제공 | ✅ 가능 (virtual, 필드 등) | ❌ 없음 (단순 시그니처) |
추상화 수준 | 구체적 (기능 포함) | 완전 추상적 |
설계 유연성 | 낮음 (강한 결합) | 높음 (약한 결합) |
❓
그럼 클래스의 abstract와 인터페이스는 좀 비슷한거 아니야? 라고 생각이 들었다.
💯 딱 그거야!
많은 사람들이 처음에 “abstract class랑 interface… 비슷한데 뭐가 달라?” 라고 궁금해해.
왜냐면 둘 다 “강제 구현”을 요구하고, 직접 인스턴스를 만들 수 없고, 자식이 override 해야 하니까 헷갈릴 수 있어.
근데! 실제로는 의도와 사용 목적이 분명하게 다르기 때문에
**"언제 abstract class를 쓰고 언제 interface를 쓰는가?"**가 중요한 핵심이야.
✅ 공통점
인스턴스 생성 불가 | abstract class, interface 모두 직접 new로 못 만듦 |
메서드 강제 구현 | 자식 클래스가 반드시 override해야 하는 메서드 있음 |
다형성 지원 | 부모 타입으로 자식 인스턴스를 다룰 수 있음 (Animal a = new Dog()) |
⚔️ 차이점
항목 | abstract class | interface |
목적 | 공통 로직 공유 + 일부 구현 강제 | **기능 명세(역할)**만 정의 |
기본 구현 제공 | ✅ 가능 (필드, 메서드, 속성 등) | ❌ 원칙상 불가능 (C# 8부터 일부 가능하긴 함) |
필드 선언 | ✅ 가능 | ❌ 불가능 |
생성자 | ✅ 가질 수 있음 | ❌ 없음 |
상속 개수 | ❌ 단일 상속만 가능 | ✅ 다중 상속 가능 |
접근 제한자 | ✅ 사용 가능 (protected, private, 등) | ❌ 기본적으로 public only |
🎮 메이플스토리 비유로 다시 정리!
abstract class | 공통 기능 + 각 직업 전용 스킬: 기본 체력 시스템, 레벨업 시스템 등 공유됨 + 각 전직 클래스가 고유 스킬 구현 |
interface | 공격 가능한 존재: 플레이어, 몬스터, 보스가 각각 다른 방식으로 Attack() 구현함 → 역할만 공유함 |
✅ 언제 abstract class를 쓰고 언제 interface를 써?
공통 로직도 공유해야 함 | ✅ abstract class |
여러 클래스가 같은 기능을 수행하지만, 내부 로직은 각자 다르게 하고 싶을 때 | ✅ interface |
여러 개의 기능(역할)을 동시에 구현해야 함 | ✅ interface |
기본 멤버/필드/생성자도 물려줘야 함 | ✅ abstract class |
🧠 기억하기 좋은 한 줄 요약
interface는 “무엇을 할 수 있는가”를 말하고,
abstract class는 “무엇을 공유할 것인가”를 말한다.
✅
흠.. 클래스 상속과 인터페이스는 알겠는데 아직까지 솔직히 abstract Class와 Interface의 차이가 이론적으로는 알겠지만 마음으로 와닿지 않는다 이건 직접 유니티로 구현해보면서 경험을 쌓는 수 밖에 없을 듯 하다..
'C#' 카테고리의 다른 글
C# - Parent obj = new Child(); 메모리는 어떻게 될까? & 다형성 (1) | 2025.07.03 |
---|---|
C# - base 키워드 (3) | 2025.07.03 |
C# - Virtual & abstract (0) | 2025.07.03 |
C# - 자료구조 (1) | 2025.07.02 |
C# - 해쉬셋(HashSet) vs Dictionary(HashTable) (2) | 2025.07.02 |