C++ 함수의 오버로딩
이미 앞서 객체지향 언어를 배운사람들은 다들 알고있는 내용 입니다.
자바를 배우신분들은 메소드 오버로딩으로 익히 알고있는 내용이죠.
오버로딩(Over loading) 이란, 직역하면 과적재라는 뜻을 가지고있습니다.
실제에 비유한다면 '카고 차량등에 짐을 과적재' 한다 할 수 있습니다.
이를 프로그래밍 언어에 빗대서 생각한다면 무엇을 과적재 할 수 있을까요?
이를 간단하게 C++에서 설명해보도록 하겠습니다.
C++에서의 함수의 오버로딩이란?
우리는 함수를 사용할때 다음과 같이 정의합니다.
int Function(int num){
return num;
}
간단하게 설명하면 int(정수형) 변수의 Function이라는 이름을 가진 함수를 선언하고 Function이라는 함수는 int(정수형) num인 자료형을 포함한다. 그리고 이 함수는 num을 반환한다. 라고 정의할 수 있습니다.
이러한 함수를 우리가 다음과 같이 정의하면 어떻게 될까요?
int Function(int num){
return num;
}
int Function(int num1, int num2){
return num1+num2;
}
C에서는 같은 이름의 함수를 선언하는것을 허용하지 않습니다..
그래서 C에서 위와 같은 함수를 정의한다면 오류가 발생할 것입니다.
하지만 C++에서는 위와 같은 함수 선언을 허용합니다.
이를 보고 함수의 오버로딩이라고 합니다.
위와 같은 오버로딩이 가능하려면 몇가지 조건을 충족시켜야합니다.
- 매개 변수의 선언이 달라야한다. [자료형 혹은 매개 변수의 갯수]
- 반환형이 같아야 한다.
예를 들어서 이를 이해시켜 드리겠습니다.
C++에서의 함수 오버로딩의 예
// 옳은 예
int Function(int n, char c) { }
int Function(char c) { }
int Function(int n) { }
// 잘못된 예 1
int Function(int n) { }
void Function(int n, int m) { }
// 잘못된 예 2
int Function(int n) { }
int Function(int n) { }
예시로 3가지를 제시하였습니다.
이 예시들을 보고 잘못된 부분, 옳은 부분을 모두 파악 할 수 있다면 오버로딩에 대해 문법적인 이해가 끝난것입니다.
첫번째, 옳은 예
보자마자 알게되는 사실이 몇가지 있습니다.
- 자료형이 같다.
- 함수의 이름이 같다.
- 각 함수별로 매개 변수가 다르다.
함수 오버로딩을 충족할 수 있는 조건이 만족되어 있죠.
두번째, 잘못된 예 1
여기서도 무엇이 잘못되어있는지 바로 파악하실 수 있을겁니다.
- 함수의 반환형이 같지 않다.
이는 반환형 자체가 함수 호출시 함수를 구분하는 기준이 될 수 없기때문에 문법적인 오류가 됩니다.
세번째, 잘못된 예2
여기서도 간단히 파악할 수 있습니다.
- 매개 변수의 자료형 혹은 갯수가 다르지않다.
함수 오버로딩에서의 함수 호출시 함수를 구분짓는 기준은 매개변수의 갯수 혹은 자료형의 일치 입니다.
하지만 이처럼 함수를 정의하게 된다면 함수 호출시 어떠한 함수를 호출해야할지 모르기 때문에 에러를 발생시키게됩니다.
이제 이 지식을 바탕으로 함수 오버로딩의 간단한 예제를 작성해봅니다.
#include <iostream>
void Function(void) {
std::cout << "매개 변수가 없는 함수 호출" << std::endl;
}
void Function(int n) {
std::cout << " 매개변수가 정수형이고 한개인 함수 호출 " << std::endl;
}
void Function(char c) {
std::cout << " 매개변수가 문자형이고 한개인 함수 호출 " << std::endl;
}
void Function(int n, int m) {
std::cout << " 매개변수가 정수형이고 두개인 함수 호출 " << std::endl;
}
void Function(int n, char c) {
std::cout << " 매개변수가 정수형과 문자형이고 각각 한개인 함수 호출" << std::endl;
}
void Function(int n, int c, int d) {
std::cout << " 매개변수가 정수형이고 세개인 함수 호출 " << std::endl;
}
int main(void)
{
Function(); //Function(void) 호출
Function(1); //Function(int n) 호출
Function('c'); //Function(char c) 호출
Function(1, 2); //Function(int n, int m) 호출
Function(1, 'c'); //Function(int n, char c) 호출
Function(1, 2, 3);//Function(int n, int c, int d) 호출
return 0;
}
예제를 살펴보면 어떠한 방식으로 오버로딩된 함수들을 구분지어 호출하는지 파악할 수 있을겁니다.
C++ 함수의 오버로딩
질문, 오타, 개념의 오류 댓글 남겨주시거나
4538cgy@gmail.com으로 연락주시면 빠르게 수정하겠습니다.