Ch 09. 함수 - 07. 함수 오버로딩

2025. 4. 18. 10:13Programming Language/C++

반응형

1. 함수의 오버로딩(overloading)

함수 오버로딩(function overloading)은 같은 이름의 함수를 여러 개 정의하는데 매개변수의 타입이나 개수, 순서를 다르게 구성하여 서로 구별되게 만드는 기능으로 정리하면 하나의 함수 명으로 매개변수를 다르게 해서 여러개를 만들 수 있게 하는 것을 말한다.

#include <iostream>

void print(int n) {
    std::cout << "정수: " << n << std::endl;
}

void print(float f) {
    std::cout << "실수: " << f << std::endl;
}

void print(std::string s) {
    std::cout << "문자열: " << s << std::endl;
}

int main() {
    print(10);         // → print(int)
    print(3.14f);      // → print(float)
    print("Hello");    // → print(std::string)
}

 

2. 오버로딩이 가능한 조건

함수의 오버로딩은 매개변수의 개수, 자료형, 순서를 다르게 하면 생성이 가능하다.

 

1) 매개변수의 갯수가 다른 함수의 오버로딩

void func(int a, int b){           // 매개변수 2개
    ....
}

void func(int a, int b, int c){    // 매개변수 3개
    ....
}

 

2) 매개변수의 타입이 다른 함수의 오버로딩

void func(int a){     // 매개변수 타입 int
    ....
}

void func(double b){  // 매개변수 타입 double
    ....
}

 

3) 매개변수의 순서가 다른 함수의 오버로딩

void func(int a, float b){  // 매개 변수 순서 : int - float

}

void func(float b, int a){  // 매개 변수 순서 : float - int

}

 

3. 함수의 오버로딩의 주의점

1) 반환 타입으로는 오버로딩이 되지 않는다

함수의 반환타입이 다르다고 하더라도 함수의 시그니쳐, 함수의 매개변수의 차이(위에서 언급한)가 없는 경우엔 오버로딩이 불가능하다.

int func(int a){
    ....
}

double func(int a){ // ❌ 반환형이 다르더라도 매개변수가 동일하기에 오버로딩 되지 않음
    ....
}

 

2) 디폴트 매개변수로 인해 오버로딩 함수의 모호성이 생길 수 있음

디폴트 매개변수를 사용하면 함수를 호출할 때에 디폴트 매개변수가 선언되어 있는 매개변수는 궂이 보내지 않아도 되었었는데 그에 따라서 오버로딩 된 함수의 경우는 어떤 함수를 불러야할지 모르는 문제가 발생할 수 있다

void func(int a){
    ....
}
void func(int a, int b = 0){ // ❌ 충돌 가능성 있음
    ....
}


int main(){
	func(10); // => 디폴트 매개변수가 선언된 매개변수 2개의 func인지 매개변수 1개의 func인지 모호함
}

 

4. 오버로딩이 가능한 이유

매개변수가 다른 동일한 이름의 함수를 여러개 선언이 가능한 이유는 함수 오버로딩이 가능한 이유는 바로 컴파일러가 함수 이름을 내부적으로 다르게 바꾸는 네임 맹글링(Name Mangling) 덕분에 가능한 일이다.

 

네임 맹글링(Name Mangling)이란?

C++ 컴파일러가 함수 이름 + 매개변수 타입/순서 정보를 조합해서 고유한 내부 이름(symbol) 로 바꾸는 기법을 말하는데 만약 아래와 같은 함수가 있다면

함수가 이렇게 다른 매개변수로 여러개 선언되고 나서 이걸 컴파일러가 읽어 들일때 이 함수들의 이름을 컴파일러가 각각 어떤 규칙에 따라서 변경하게 된다.

 

GCC 기준으로는 각각 

 

  • _Z4funcii → func(int, int)
  • _Z4funcf → func(float)
  • _Z4funcd → func(double)
  • _Z4funcif → func(int, float)

와 같이 함수의 명칭을 고유한 이름으로 변환한다.

이 방식은 컴파일러 마다 다르기에 고정되어 있는 방식은 아니다.

아무튼 이렇게 컴파일러가 변환하면서 충돌하지 않고 별도의 함수로 인식할 수 있게 되는 것이다.

그리고 이걸 메인 함수에서 사용할때

 

컴파일 타임에 호출한 함수가 어떤 함수와 연결될지(바인딩될지) 결정되는 방식Static Binding, 정적 바인딩이라고 한다.

 

기존에 

이런 사용이 가능했던 이유도 이렇게 함수의 오버로딩이 가능하기 때문이다.

 

 

반응형