Notice
Recent Posts
Recent Comments
Link
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Archives
Today
Total
관리 메뉴

I'm FanJae.

[20260506] C# ( 오버로딩 & 오버라이딩 차이점 ) 본문

Unity/Unity 초격차캠프

[20260506] C# ( 오버로딩 & 오버라이딩 차이점 )

FanJae 2026. 5. 6. 17:21

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. 정리

- 오버로딩은 컴파일 시점에 매개변수로 결정된다.

- 반면, 오버라이딩은 런타임 시점에 실제 객체 타입으로 결정된다.

 
Comments