본문 바로가기

문과 코린이의, [C. C++] 기록/C++ 이론

[문과 코린이의 IT 기록장] C,C++ - 함수의 오버로딩 (함수의 오버로딩에 대한 이해, 함수의 오버로딩 과정)

반응형

[문과 코린이의 IT 기록장] C,C++ - 함수의 오버로딩 (함수의 오버로딩에 대한 이해, 함수의 오버로딩 과정)




 1. 함수의 오버로딩에 대한 이해
- C++에는 C와는 다른 '함수의 오버로딩'이라는 새로운 기능을 갖는다.
* C라이브러리에는 pirntf와, scanf가 1개씩만 존재한다.
* 그렇지만 C++에서는 같은 이름을 가진 함수가 여러 개 존재해도 된다. 즉, 함수의 이름에 과부하가 걸려도 상관이 없다는 것이다.

- 그렇다면 C++에서 같은 이름의 함수를 호출했을 때 구분하는 방법은?
: 함수의 인자를 보고 결정하게 된다.

ex)

- pirnt함수가 3개나 정의되있음에도 불구하고, C와 다르게 오류가 발생하지 않는 것을 볼 수 있다.
- 즉, C++에서는 함수의 이름이 같더라도 인자가 다르다면, 다른 함수로 판단한다.

Print(a); // a는 int형이므로, int형 인자를 가지는 (1)print함수가 호출된다.
Print(b); // b는 char형이므로, char형 인자를 가지는 (2)print함수가 호출된다.
Print(c); // c는 double형이므로, double형 인자를 가지는 (3)print함수가 호출된다.
- 다시말해서, C++에서는 컴파일러가 알아서 적합한 인자를 가지는 함수를 찾아서 호출해 주게 된다.




 2. 함수의 오버로딩 과정
ex )

이 코드에서는 좀 특이한 결과를 이끌어낸다.

- a혹은 c의 경우에는, 필요로 하는 인자를 나타내는 정확한 함수들이 있어서 성공적으로 호출이 가능하다.
- 그러나, char의 경우는 자신과 정확하게 일치하는 인자를 가지는 함수가 없기 때문에, '자신과 최대로 근접한 함수'를 찾게 된다.



[ C++컴파일러에서 함수를 오버로딩 하는 과정 ]
1. 자신과 정확히 자료형이 일치하는 함수를 찾는다.

2. 정확히 일치하는 타입이 없는 경우, 아래와 같은 형변환을 통해서 일치하는 함수를 찾아본다.

- char, unsigned char, short -> int로 변환
- unsigned short -> int의 크기에 따라, int 혹은 unsigned int로 변환된다.
- float -> dobule로 변환
- enum -> int로 변환


3. 1,2를 모두 거쳐도, 일치하는 것이 없다면, 아래의 좀 더 포괄적인 형변환을 통해 일치하는 함수를 찾는다.

- 임의의 숫자(numeric)타입다른 숫자 타입으로 변환된다. (ex. Float->int)
- enum임의의 숫자 타입으로 변환된다. (ex. Enum -> double)
- 포인터 타입이나 숫자 타입으로 변환된 0은, 포인터 타입이나 숫자 타입으로 변환된다.
- 포인터는 void 포인터로 변환된다.



4. 유저 정의된 타입 변환으로 일치하는 것을 찾는다. 만약 컴파일러가 위 과정을 통하더라도 일치하는 함수를 찾을 수 없거나, 같은 단계에서 두 개 이상이 일치하는 경우엔, 모호하다라고 판단해서 오류를 발생하게 된다.
ex ) 모호한 오버로딩

- 이 코드에서는, print(int x)와, print(char x)함수밖에 존재하지 않는다.

 

- print(c)를 했을 때,
// 1단계에서는 명백하게 일치하는 함수가 없다.
// 2단계에서도 double과 관련한 내용이 없기 때문에, 일치하는 것이 없다.
// 3단계에서는, '임의의 숫자 타입이 임의의 숫자 타입'으로 변환될 수 있다고 되어 있다. 이 때문에 double은 char도, int도 모두 변환 될 수 있게 된다.

- 따라서 같은 단계에 두 개 이상의 가능한 일치가 존재하므로, 오류가 발생하게 되는 것이다.

 


* 유의사항
- 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다.
- 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다.
- 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :)
반응형