I'm FanJae.
[20260506] C# ( 오버로딩 & 오버라이딩 차이점 ) 본문
1. 메서드 오버로딩 (Method Overloading)
(1) 정의
- 메서드 오버로딩은 동일한 함수의 이름을 사용해서 매개 변수의 타입이나 갯수 또는 순서를 다르게 하여 같은 이름의 메서드를 여러 개를 선언하거나 정의하는 것을 의미한다.
int add(int a, int b);
int add(int a, int b, int c);
double add(double a, double b);
(2) 함수 오버로딩을 사용하는 이유
① 가독성 및 편의성 향상
- 함수 오버로딩을 사용하는 이유는 비슷한 작업을 수행하는 여러 함수가 있을 때 각 함수에 다른 이름을 부여하는 대신 함수 오버로딩을 사용하면 코드의 가독성이 향상되고, 다양한 형태의 함수를 호출 가능하다.
② 일관성 유지
- 비슷한 작업을 하는 함수들이 많은 경우 함수 오버로딩을 사용하면 각 함수들이 동일한 이름을 가지고 있어서 코드의 일관성을 유지할 수 있다.
(3) 메서드 오버로드의 조건
- 함수 이름이 동일해야 한다.
- 리턴 타입만 다른 것은 허용되지 않는다.
- 매개 변수의 데이터 타입이 다르거나 개수가 달라야 한다.
(4) 함수 오버로딩의 원리
① C++에서 사용하는 기법
- C++에서는 함수 오버로딩을 할 때 Name mangling이라는 기법을 사용했다.
- Name mangling이라는 것은 Compiler가 함수나 변수의 이름을 임의로 변경하는 것이다.
- 이를 이용해서 서로 같은 이름의 함수를 찾을 수 있게 만드는 것이다.

② C#에서 사용하는 기법
- C++과 다르게 C# 에서 함수 오버로딩은 CLR 메타데이터에 저장된 메서드 시그니처를 저장한다.
- 이를 이용해 컴파일러가 호출 시점의 인자 타입을 기준으로 어떤 메서드를 호출할지 결정한다.
- 즉, C++처럼 링커 심볼 기반 name mangling으로 오버로딩을 해결하지 않고, CLR 메타데이터에 저장된 method signature를 기반으로 메서드를 식별한다.

2. 메서드 오버라이딩 (Method Overriding)
(1) 정의
- 메서드 오버라이딩은 부모 클래스의 메서드를 자식 클래스에서 재정의하는 경우를 의미한다.
- 즉, 상속받은 기능을 자식 클래스에 맞게 바꿔쓰는 것을 의미한다.
class Monster
{
public virtual void Attack()
{
Console.WriteLine("몬스터가 공격한다");
}
}
class Slime : Monster
{
public override void Attack()
{
Console.WriteLine("슬라임이 몸통 박치기를 한다.");
}
}
- 위처럼 Slime 은 Monster 의 Attack() 을 자기 방식으로 다시 정의하는 것이다.
(2) 함수 오버라이딩을 사용하는 이유
① 다형성 구현
- 오버라이딩을 사용하면 부모 타입으로 자식 객체를 참조하더라도, 실제 객체 타입에 맞는 메서드의 호출 가능하다.
Monster monster = new Slime();
monster.Attack(); // 슬라임이 몸통 박치기를 한다.
② 자식 클래스에 맞는 동작 재정의
- 부모 클래스에서 공통적은 메서드 구조를 제공한다.
- 자식 클래스는 자신의 특성에 맞게 동작을 변경할 수 있다.
③ 코드 확장성 향상
- 부모 타입을 기준으로 코드를 작성해도, 새로운 자식 클래스가 추가되었을 때 각 클래스의 오버라이딩 된 메서드가 실행된다. 따라서 확장에 유리하다.
(3) 메서드 오버라이딩의 조건
- 상속 관계가 있어야 한다.
- 부모 클래스의 메서드가 virtual , abstract , override 중 하나로 선언되어야 한다.
- 자식 클래스에서는 override 키워드를 사용한다.
- 메서드의 이름, 매개 변수, 반환 타입이 동일해야 한다.
- 접근 제한자는 부모 메서드보다 더 제한적으로 변경할 수 없다.
- 즉, 부모 메서드보다 자식 오버라이딩 메서드의 공개 범위를 좁힐 수 없다.
- 일반적으로는 오버라이딩을 진행할 때, 접근 제한자를 동일하게 둔다.
class Monster
{
public virtual void Attack() { }
}
class Slime : Monster
{
private override void Attack() { } // 부모 클래스의 공개 범위보다 좁아서 불가능
}
(4) 메서드 오버라이딩의 원리
- 기본적으로, 오버라이딩된 메서드는 컴파일 시점이 아니라 런타임 시점에 실제 객체 타입을 기준으로 호출된다.
- 이것이 가능한 이유는 C#의 virtual / override 메서드는 CLR 내부의 가상 메서드 테이블(Virtual Method Table)을 사용해 관리되고 있기 때문이다.
- 부모 클래스의 virtual 메서드는 가상 함수 테이블에 등록된다.
- 자식 클래스에서 override를 하면 해당 슬롯을 자식 메서드로 교체한다.
- 런타임에서는 실제 객체가 가진 가상 메서드 테이블을 참조하여 호출할 메서드를 결정한다.
3. 정리
- 오버로딩은 컴파일 시점에 매개변수로 결정된다.
- 반면, 오버라이딩은 런타임 시점에 실제 객체 타입으로 결정된다.
'Unity > Unity 초격차캠프' 카테고리의 다른 글
| [20260507] C# ( 추상 클래스 & 인터페이스의 차이점 ) (0) | 2026.05.07 |
|---|---|
| [20260507] C# ( 추상 클래스, 인터페이스 ) (0) | 2026.05.07 |
| [20260506] C# (캡슐화, 상속, 다형성) (0) | 2026.05.06 |
| [20260504] C# (프로퍼티, 생성자, 메서드 II) (0) | 2026.05.04 |
| [C# 리마인드] 콘솔 스네이크 게임 만들기 (0) | 2026.05.03 |