C++ Chapter 7.5 : 함수 오버로딩

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!


chapter 7. 함수 : 함수 오버로딩

오버로딩이란?

함수의 이름 재사용. 함수 이름이 같아도 매개 변수가 다르면 다른 함수로 인식 된다.

void getRandom(int & x) { }
void getRandom(double & x) { }

int main()
{
    int x;
    getRandom(x); // x는 int이므로 void getRandom(int & x) 함수가 오버로딩되어 호출된다.
}

함수의 이름은 동일하나 매개변수 개수, 매개변수 타입이 다르면 다른 함수로 인식된다. 동일한 이름을 가진 함수 중 호출 형태에 따라 어떤 함수를 호출할지 컴파일러가 판단한다. 이를 함수의 오버로딩이라고 한다.

  • 위의 코드에서 인수인 x가 int이기 때문에 getRandom 동일한 이름을 가진 두 함수 중 매개변수 타입이 int인 void getRandom(int & x)가 호출된다.
int get(){ }
double get(){} // 에러! 동일한 함수가 이미 존재함. 재선언이므로 오류

리턴 타입은 다른 함수라고 판단되는 기준이 되지 않는다. 리턴 타입은 함수 오버로딩의 고려 대상이 아니라는 것을 주의할 것! 위 코드의 두 함수는 같은 함수라고 인식되어 오류남.

int Add (int a, int b) { ... }
int Add (int b, int a) { ... }

‘매개변수 이름’ 또한 다른 함수라고 판단되는 기준이 되지 못한다. 위 두 함수는 같은 함수로 판단되어 에러가 난다.

typedef int my_int;

void print(int x) {}
void print(my_int x) {} // 에러! 동일한 함수가 이미 존재함. 재선언이므로 오류

이렇게 int를 my_int로 눈속임 해도 함수의 이름과 매개변수 수와 매개변수 타입까지 같은 동일한 함수이기 때문에 동일한 함수 재선언으로 오류가 난다.

이렇기에 굳이 오버로딩을 사용하기 보다는 그냥 함수의 이름을 달리 해주는 것을 권장한다.

void print(char * value){}
void print(int value){}

int main()
{
    print(0);    // void print(int value) 에 매칭된다.
    print('a');  // void print(int value) 에 매칭된다. 
    print("a");  // ✨ 매치되는 함수가 없다고 나온다! 

    return 0;
}

'a'는 작은 따옴표라 char 타입이므로 int, char 타입인 매개변수를 가진 동일한 이름의 함수에 매칭될 수 있지만 "a"는 큰따옴표라 문자열이기 때문에 매칭되는 함수가 없다고 나온다. char * 타입은 문자열 리터럴로 초기화가 할 수 없기 때문이다

void print(const char * value){}
void print(int value){}

int main()
{
    print(0);    
    print('a');   
    print("a");  //  void print(const char * value) 에 매칭된다.

    return 0;
}

const를 붙여 const char *로 만들면 정상적으로 매칭 될 것. const char *은 문자열 리터럴로 초기화될 수 있기 때문에. C언어 스타일의 문자열 기호적 상수 포스팅 참고

void print(unsigned int value){}
void print(float value){}

int main()
{
    print(0);         // 오류!  int이지만 unsigned 타입이라 알 수 없음
    print('a');       // 오류!  char타입이라 어떤 print을 써야할지 알 수 없음
    print(3.141592);  // 오류!  double형이지만 형변환으로 int에도 들어갈 수 있어서 애매

    return 0;
}

이처럼 어느 함수에 오버로딩 될 수 있는지 컴파일러 입장에서 판단이 안설 때는 오류가 난다.

void print(unsigned int value){}
void print(float value){}

int main()
{
    print(0u);              
    print((unsigned int)'a');       
    print(3.141592f);  

    return 0;
}

이렇게 넘기는 인수의 타입을 명확히 해주면 해결된다.



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Cpp 카테고리 내 다른 글 보러가기

댓글 남기기