상세 컨텐츠

본문 제목

C++ 함수 오버로딩

C++/C++98

by deulee 2023. 8. 3. 17:55

본문

함수 오버로딩이란?

함수 오버로딩(function overloading)은 다른 매개 변수를 가진 같은 이름의 여러 함수들을 만들 수 있는 C++의 기능이다.

 

왜 이런걸 만들었을까?

 

이건 나중에 나올 연산자 오버로딩과 같은 개념에 사용되기 때문에 굉장히 유효하지만 지금 당장 그것에 대해 알 필요는 없는 것 같다.

 

#include <iostream>

int func(int a)
{
	return a + 1;
}

double func(double a)
{
	return a + 2;
}

int func(char c)
{
	return c + 1;
}

int main(void)
{
	std::cout << func(44) << std::endl;
	return 0;
}

여기 이름이 같지만 매개변수가 다른 3개의 함수가 있다. 보통의 생각으로는 네이밍 충돌을 일으킬 것 같지만, C++에서는 그렇지 않다.

 

컴파일러는 함수 호출에 사용된 인자를 기반으로 func()을 선택할 수 있다. 위의 경우에는 int func(int) 함수가 호출될 것이다.

 

이렇듯 C++에서는 함수가 고유한 매개 변수를 가지고 있는 한 원하는 만큼 많은 오버로드된 add() 함수를 정의할 수 있다.

 

어떻게 이게 가능할까?

 

이 이유는 함수의 시그니처(signature)가 각각 다르기 때문이다. 함수 오버로딩에서 사용되는 함수의 시그니처는 다음 순서로 구성되어 있다.

 

1. 함수의 이름

2. 매개 변수의 개수

3. 매개변수의 타입 및 매개변수의 순서

 

즉, 이 3가지를 통해서 다양한 시그니처를 구성할 수 있고 컴파일러는 이것을 바탕으로 함수를 선택할 수 있는 것이다.

 

주의점

오버로딩에서 사용되는 함수의 시그니처를 보면 반환 타입이 없는 것을 알 수 있다.

 

그렇다. 반환 타입으로는 함수를 구분할 수가 없다.

 

double func(int); // 구분 못함

int func(int); // 구분 못함

 

그러니 이러한 실수를 하지 않도록 주의해야 한다.


 

'typedef' 선언은 새로운 타입을 만드는 것이 아니므로 아래의 두 선언은 동일하게 간주되니 조심해야 한다.

 

typedef int hello;
void print(hello value);
void print(int value); // 에러

 

이 외에도 조심해야 할 부분이 있지만 정확하게 명시하는 것을 잊지 않는다면 일어나지 않을 에러들이다.

'C++ > C++98' 카테고리의 다른 글

C++ 프렌드  (0) 2023.08.05
C++ 생성자, 파괴자, 복사 생성자, 복사 대입 연산자  (0) 2023.08.03
C++ 참조자(reference)  (0) 2023.08.03
C++ 클래스  (0) 2023.08.03
OOP란?  (0) 2023.08.03

관련글 더보기