함수 오버로딩의 이해
C언어에서는 다음과 같이 동일한 이름의 함수가 정의되는 것을 허용하지 않는다.
int func(int num) /* 같은 함수명 */
{
num++;
return num;
}
int func(int a, int b) /* 같은 함수명 */
{
return a+b;
}
C언어 예시
#include <stdio.h>
void func(int* ptr1)
{
(*ptr1)++;
}
void func(int* ptr2, int* ptr3)
{
(*ptr2)++;
(*ptr3)++;
}
int main(void)
{
int num1 = 0;
int num2 = 0;
int num3 = 0;
func(&num1);
func(&num2, &num3);
printf("%d", num1);
printf("%d", num2);
printf("%d", num3);
}
함수명이 같아 에러가 발생한다.
아래와 같이 같은 이름을 가진 함수가 있다고 가정
#include <iostream>
int func(int num) /* 같은 함수명 */
{
num++;
std::cout << num << std::endl;
return num;
}
int func(int a, int b) /* 같은 함수명 */
{
std::cout << a + b << std::endl;
return a+b;
}
int main(void) {
func(20); // func(int num) 호출
func(10, 20); // func(int a, int b) 호출
return 0;
}
위의 main 함수에 삽입된 주석에서 설명하듯이 함수호출 시 전달되는 인자를 통해서 호출하고자 하는 함수의 구분이 가능하기 때문에 매개 변수의 형태가 다르다면, 동일한 이름의 함수정의를 허용할 수 있다
C++에서는 이를 허용한다.
이를 함수의 오버로딩(overloading)
C언어가 함수 오버로딩을 허용하지 않는 이유, C와 C++의 함수 찾는 방식이 다르기 때문
C++ : 두 개의 int형 정수를 인자로 전달 받을 수 있는 func이름의 함수 찾음
C : func 함수 어디있음?
함수 오버로딩의 예
함수의 오버로딩이 가능 하려면 매개변수의 선언이 달라야 함.
아래 두쌍의 함수들은 오버로딩이 가능하다.
int func(char c){...}
int func(int c){...}
int func(int a){...}
int func(int b, int c){...}
첫 번째의 경우 자료형이 다르기 때문에 자료형을 통해 호출할 함수 구분이 가능하며
두 번째의 경우 매개변수의 개수가 다르므로, 전달되는 인자의 개수를 통해서 호출할 함수의 구분이 가능하다.
잘못된 오버로딩의 예
void func(int c){...}
int func(int c){...}
두 함수의 반환형이 다르다.
하지만 반환형은 함수호출 시, 호출되는 함수를 구분하는 기준이 될 수 없다.
오버로딩 예제
#include <iostream>
void func(void)
{
std::cout << "func(void) called" << std::endl;
}
void func(char c)
{
std::cout << "func(char c) called" << std::endl;
}
void func(int a, int b)
{
std::cout << "func(int a, int b) called" << std::endl;
}
int main(void) {
func();
func('A');
func(12, 13);
return 0;
}
참고 : [윤성우 열혈 C++ 프로그래밍] - 대부분의 내용 및 코드는 이 책에서 개인 공부 정리 목적으로 참고하였습니다.
'Language&Framework&Etc > C++' 카테고리의 다른 글
C언어 기반의 C++(01-5) 이름공간(namespace)에 대한 소개 (0) | 2020.12.20 |
---|---|
C언어 기반의 C++(01-4) 인라인(inline) 함수 (0) | 2020.12.20 |
C언어 기반의 C++(01-1) printf와 scanf를 대신하는 입출력 방식 (0) | 2020.12.19 |
1-5 이름공간(namespace)에 대한 소개 추가(함수 선언 정의) (0) | 2020.11.18 |
1-5 이름공간(namespace)에 대한 소개 (0) | 2020.11.18 |