C++ 함수 오버로딩
안녕하세요 열코입니다.
이번시간에는 C++ 에서 함수 오버로딩에 대해 알아보겠습니다.
☞ 함수 오버로딩이란?
같은 함수의 이름을 가지고 있지만 파라미터(매개변수) 및 리턴 타입 등의 특징이 다른 여러개의 함수를 만드는 것입니다.
예를들어 우리가 C++ 프로그래밍을 할 때에 cout 출력 함수를 통해 int, char, string, double 등의 여러가지 타입의 자료형을
다른 함수가 아닌 cout 하나의 함수를 통해 출력할 수 있는 기능을 구현하는데 사용됩니다.
* 너무 많이 함수를 오버로딩 할 경우 코드가 복잡해지며 어떤 오버로드 함수가 호출되었는지 알기 힘들어지므로
적절한 상황에 적당히 사용하는것을 권합니다.
☞ 함수 오버로딩 예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #include <iostream> using namespace std; int yc(int i) { return i + 1; } char yc(char c) { return c + 1; } double yc(double d) { return d + 1.1; } int main(void) { int x = 5; char y = 'a'; double z = 3.3; cout << yc(x) << "\n"; cout << yc(y) << "\n"; cout << yc(z) << "\n"; return 0; } | cs |
위의 코드처럼 같은 이름을 가진 함수가 여러개 존재합니다.
main 함수에서는 yc() 라는 함수를 호출할 뿐이고 매개변수로 int, char, double 형식이 순서대로 들어갑니다.
컴파일러는 매개변수를 구분하여 어떤 함수를 호출할 지 결정합니다.
ㅇ 출력 결과
6
b
4.4
☞ 함수 오버로딩이 가능하지 않은 경우?
Microsoft MSDN에서는 함수 오버로드 고려사항으로 다음과 같이 정의합니다.
출처 : https://msdn.microsoft.com/ko-kr/library/5dhe1hce.aspx
C++에서 함수 오버로딩을 할 수 없는 함수들을 하나씩 살펴보도록 하겠습니다.
1. 반환 값의 형식만 다른 함수 선언.
1 2 3 4 5 6 7 8 | int yc() { return 1; } char yc() { return 'c'; } | cs |
위와 같이 반환 값의 형식만 다른 함수를 오버로드 할 경우 다음과 같은 컴파일 오류가 발생합니다.
- 반환 형식으로만 구분되는 함수를 오버로드할 수 없습니다.
- 'char yc(void)': 오버로드된 함수가 'int yc(void)'과(와) 반환 형식만 다릅니다.
- 'yc': 재정의. 기본 형식이 다릅니다.
2. 형식이 같은 static(정적) 멤버 함수를 오버로드하는 경우.
1 2 3 4 5 6 | class YC { static void yc(int i) {} void yc(int i) {} }; | cs |
위와 같이 반환 값 형식과 매개변수 형식이 같은 정적 메소드와 비 정적 메소드를 오버로드할 수 없습니다.
다음과 같은 컴파일 오류가 발생합니다.
- 매개 변수 형식이 같은 정적 및 비정적 멤버 함수를 오버로드할 수 없습니다.
3. 매개변수 형식이 배열과 포인터
1 2 | int yc(int *p); int yc(int p[]); | cs |
위와 같이 함수 몸체가 없이 정의만 하는 경우 컴파일 오류는 발생하지 않지만, 컴파일러가 동일한 함수로 인지합니다.
매개변수 배열 선언은 포인터 선언으로 조정되기 때문에 단순히 위의 함수를 재정의 하는 구문입니다.
아래 코드의 경우도 마찬가지로 동일한 함수를 재정의하는 구문입니다.
1 2 3 | int yc(int ); int yc(int *); | cs |
매개변수에 const로 구분을 짓는것 또한 마찬가지입니다.
1 2 3 4 5 6 | int yc(int x) { return x; } int yc(const int x) { return x; } | cs |
위와 같이 함수를 선언한 경우에는 컴파일 에러를 발생시킵니다.
- 'int yc(int)' 함수에 이미 본문이 있습니다.
위의 케이스들은 함수 오버로딩이 아닌 단순 함수 재정의라고 볼 수 있습니다.
이상 'C++ 함수 오버로딩'에 대해 알아보았습니다.
질문 또는 오타나 잘못된 정보가 있는 경우 댓글로 달아주세요!
공감♡ 버튼을 눌러주시면 더욱 유용하고 좋은 포스팅으로 찾아 뵙겠습니다.
[관련 게시글]
2018/10/08 - [C, C++] - C/C++ 구조체 사용법 및 예제
2018/10/09 - [C, C++] - C++ 클래스와 객체
2018/10/11 - [C, C++] - C/C++ 메모리 동적할당
'C, C++' 카테고리의 다른 글
C 표준 입력 함수 scanf (0) | 2018.10.23 |
---|---|
C 표준 출력 함수 printf() (0) | 2018.10.22 |
C++ 가상 함수(Virtual Function) (8) | 2018.10.19 |
C++ 연산자 오버로딩 (2) | 2018.10.12 |
C/C++ 메모리 동적할당 (0) | 2018.10.11 |
C++ friend 클래스와 함수 (1) | 2018.10.10 |
C++ 클래스 접근제한자 (0) | 2018.10.10 |
C++ 클래스와 객체 (0) | 2018.10.09 |