새소식

💻 Programming (프로그래밍)/C++

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

  • -

Q) 함수 오버로딩 맛보기

int add(int a) {}
int add(int a, int b) {}
int add(int a, double b) {}
int add(double a) {}
double add(int a) {}

 

위의 예시는 모두 함수인데요, 함수 오버로딩이란 이름은 같지만 매개변수에 따라서 컴파일러가 함수가 다른 함수인지를 고려해줍니다. (아주 똑똑하네요)

 

하지만, 리턴타입을 고려하지 않는 매개변수에 따라서만 구분이 됩니다.

 

이게 뭔말이냐면, 보통 함수오버로딩을 사용할 때

int add(int a)

int add(int a, int b) 

이렇게는 매개변수가 (int) , (int int) 로 다르기에 다른 함수로 인정합니다. 

 

하지만

int add(int a) , double add(int a)

이렇게 된다면, 매개변수 (int) , (int) 로 같은 매개변수가 들어가기에 컴파일 오류를 발생시킵니다.

 

 

혹은 보기 좋게 만들기 위해서

template <typename T>
T add (T a, T b) {}

요런식으로 사용한다면 double add (double, double) 

혹은 int add (int , int) 이런애들이 잘 실행합니다. (컴파일러가 name mangling을 하며, 함수 들을 사용시 마다 자동으로 생성해줍니다.~)

 

 

Q) C++에서는 왜 이렇게 작동하나요

A) C++의 컴파일러 스타일이, 매개변수에 따라 함수 이름을 다르게 설정해줍니다. Name mangling 때문이죠

 

 

Q) name mangling 이란?

A) 컴파일러가 함수나, 변수의 이름을 변경히는 것

 

컴파일러는 symbol을 생성할 때, 매개 변수와 함수의 이름에 따라 다르게 symbol을 만듭니다.

C++ 스타일~

 

 

 

Q) name mangling을 C 스타일로 하고싶은데요~

A) 그럴땐 extern "C" 를 쓰시면 됩니다.

extern "C" int add(int a, int b) {}

 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.