C++/C++ 기초

[C++] 함수 오버로딩 ( Function overloading )

Song 컴퓨터공학 2023. 5. 4. 21:18

함수 오버로딩(Function overloading)은 같은 이름의 함수를 중복하여 정의하는 것을 말합니다. 이러한 것을 굳이 왜 사용하느냐, C++ 에서 새로 추가된 함수 오버로딩은 여러 함수를 하나의 이름으로 연결해줍니다.

 

즉, 함수 오버로딩이란 같은 일을 처리하는 함수를 매개변수의 형식을 조금씩 달리하여 하나의 이름으로 작성할 수 있도록 해주는 것입니다. 이런 함수 오버로딩은 객체 지향 프로그래밍의 특성 중 다형성(polymorphism)의 구현입니다.

 


함수 시그니처(Function signature)

 

함수 시그니처란, 함수의 원형에 명시되는 매개변수 리스트 를 뜻합니다. 함수 오버로딩의 핵심이라고도 할 수 있습니다. 만약 두 함수가 매개변수의 개수와 그 타입이 모두 같다면, 이 두 함수의 시그니처는 같다고 할 수 있습니다. 함수의 오버로딩이란 서로 다른 시그니처를 갖는 여러 함수를 같은 이름으로 정의하는 것이라고 할 수 있습니다.

 

C++ 컴파일러는 사용자가 오버로딩된 함수를 호출하면, 그것과 같은 시그니처를 가지는 함수의 원형을 찾아 호출해줍니다. 

// 함수 원형 예시
void Display(const char* str, int n);				// 문자열 str을 n번 출력
void Display(const char* str1, const char* str2)		// 문자열 str1 과 str2를 연달아 출력
void Display(int x, int y);					// x * y를 출력
void Display(double x, double y);				// x / y를 출력

위 같은 함수들이 아래에 구현되어 있다고 생각해봅시다. 이런 상황에서 사용자가 Display() 함수를 호출하면, C++ 컴파일러는 자동으로 같은 시그니처를 가지는 함수의 원형을 찾아서 호출합니다.

 

Display("Song", 3);				// 1번 Display() 호출 -> "SongSongSong"
Display("Song", " Blog");			// 2번 Display() 호출 -> "Song Blog"
Display(3, 4);					// 3번 Display() 호출 -> 12
Display(4.2, 2.1);				// 4번 Display() 호출 -> 2
Display(4.2, 3);				// 3번과 4번 모두 호출 가능 -> 컴파일 에러

5번째 예시는 같은 함수의 호출로 첫 번째 인수는 double 형, 두 번째 인수는 int 형 인수를 전달합니다. 이런 함수 호출은 3번과 4번 시그니처의 Display() 함수를 모두 호출할 수 있으므로 컴파일 에러가 발생합니다. C++ 에서는 오버로딩한 함수의 이런 호출을 허용하지 않습니다.

 

#include <iostream>
using namespace std; // std라는 name space에 속한 정의들은 이름 안붙이고 사용 가능

void Shift(int, int);
void Shift(int, int, int);
void Shift(int, int, int, int);

int main(void)
{
    Shift(1, 2);
    Shift(1, 2, 3);
    Shift(1, 2, 3, 4);
    return 0;
}

void Shift(int a, int b) { cout << b << ", " << a << endl;; }
void Shift(int a, int b, int c) { cout << b << ", " << a << ", " << c << endl; }
void Shift(int a, int b, int c, int d) { cout << b << ", " << a << ", " << c << ", " << d; }

위처럼 함수의 오버로딩은 매개변수의 타입 뿐 아니라 매개변수의 개수가 달라도 작성할 수 있습니다.

 


 

이번 포스팅에서는 서로 다른 시그니처를 가지는 함수를 같은 이름으로 저장하는 함수 오버로딩, C++ 이 처음이라면 다소 생소할 수 있는 개념에 대해 다뤄봤습니다. 감사합니다.