본문 바로가기
C++

[C++] 함수 오버로딩(Function overloading)

by 유노brain 2023. 10. 29.
반응형

함수 오버로딩(Function overloading)

같은 이름의 함수를 여러 개 사용할 수 있습니다.

 

예를 들어 아래의 코드와 같이 나타낼 수 있습니다.

int foo(int x); //OK
int foo(int x, int y); //OK
int foo(char x); //OK
void foo(double x); //OK
void foo(int x); //ERROR!

위의 코드와 같이 같은 함수명으로 여러 가지를 선언할 수 있습니다.

하지만

마지막 foo의 경우 에러가 발생합니다.

그 이유는 맨 위에 이미 매개변수가 int인 foo를 받았기 때문입니다.

만약 foo(5)를 입력했을 때 컴파일러 입장에서 첫 번째를 말하는 건지 마지막을 말하는 건지 구분을 못합니다.

 

 

컴파일 과정에서 타겟 함수를 정한다.

컴파일 과정에서 이 함수가 여러 함수 중에 어떤 것을 뜻하는지 찾게 됩니다.
이것을 정적 디스패치(static dispatch)라고 합니다.

- 컴파일 시점에서 타겟 함수를 지정합니다.
- 런타임 overhead를 발생시키지 않습니다.
<=> 동적 디스패치(dynamic dispatch)와 반대됩니다.

 

다음은 예시 코드입니다.

#include <iostream>
using namespace std;
int foo(int x){return x + 1;}
int foo(int x, int y){return x + y;} //OK
int foo(char x){return (int) x;}//OK
void foo(double x){}; //OK


int main(){
    cout<<foo(5)<<endl; //6
    cout<<foo(3,5)<<endl; //8
    cout<<foo('c')<<endl; //99
    foo(3.7);

    return 1;

}

컴파일 시점에서 알아서 매개변수를 보고 맞는 함수에 들어갑니다.

 

 

오버라이딩 해결 규칙

1. 실행가능한 함수 수집

a. 이름이 같고 매개변수 개수가 동일한 함수 찾습니다.
b. 함수가 발견되지 않으면 컴파일러는 오류를 보고합니다.

 

2. 실행가능한 기능 중 가장 잘 일치하는 함수 찾기

a. 정확히 일치하는지 찾기(Exact match)
->인수유형과 매개변수 유형을 일치시킵니다.
b. 우선순위 (Promotion)
-> 인수유형과 매개변수유형의 우선순위를 매깁니다.
c. 타입 변환이 가능한가? (Standard type conversion)
-> 표준 규칙을 사용하여 인수 유형을 매개변수 유형으로 변환합니다.
-> 원래 값을 잃어버릴 수 있습니다.
d. 그래도 실패한다면, 컴파일 에러를 나타냅니다.

 

아래는 예시코드입니다.

#include <iostream>
using namespace std;

void foo(int x){std::cout <<"foo(int x)" <<std::endl;}
void foo(int x, float y) {std::cout<<"foo(int x, float y)" <<std::endl;}
void foo(float x, float y) {std::cout<<"foo(float x, float y)" <<std::endl;}
void foo(float x) {std::cout << "foo(float x )" << std::endl;}

int main(){
    foo(3); // foo(int x)
    foo('a'); //foo(int x)
    foo(1,2); //foo(int x, float y)
    foo(1.3f, 2.4); //foo(float x, float y)
    foo(1.3); //Error
}

 

반응형

댓글