함수 오버로딩
Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 104개 중 57번째.
함수 오버로딩을 사용하면 이름은 같지만 매개변수 목록이 다른 여러 함수를 정의할 수 있습니다. 컴파일러는 전달한 인수를 기반으로 올바른 버전을 선택합니다. 이는 컴파일 시간 다형성의 핵심적인 형태입니다.
오버로딩이 작동하려면 함수의 시그니처가 달라야 합니다. 즉, 매개변수의 개수나 타입, 또는 둘 다 달라야 합니다:
class Calculator {
public:
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
int add(int a, int b, int c) {
return a + b + c;
}
};
Calculator calc;
calc.add(5, 3); // add(int, int)를 호출합니다
calc.add(2.5, 3.7); // add(double, double)를 호출합니다
calc.add(1, 2, 3); // add(int, int, int)를 호출합니다컴파일러는 각 호출을 검사하고 적절한 overload와 일치시킵니다. 이 작업은 전적으로 컴파일 시간에 수행되므로 런타임 오버헤드가 없습니다.
중요: 반환 타입만으로는 오버로드된 함수를 구분할 수 없습니다. 다음 코드는 컴파일러 오류를 발생시킵니다.
int getValue();
double getValue(); // 오류: 반환 타입만으로 오버로드할 수 없습니다함수 오버로딩은 코드를 더 직관적으로 만듭니다. addInts, addDoubles, addThreeInts처럼 별도의 이름을 만드는 대신, 하나의 의미 있는 이름을 사용하고 나머지는 컴파일러가 처리하도록 합니다.
챌린지
쉬움function overload의 강력한 기능을 보여 주는 message formatter class를 만들어 보겠습니다. 서로 다른 유형의 inputs를 처리하는 여러 format() methods가 있는 Formatter class를 만들고, 전달하는 값에 따라 컴파일러가 올바른 버전을 선택하도록 합니다.
코드를 두 파일로 구성합니다:
Formatter.h: 다음과 같은 다양한 상황을 처리하는 overloadedformat()methods를 갖는Formatterclass를 define합니다.- 단일
std::string을 takes하고 다음을 출력하는 method:Message: <text> std::string과intpriority level을 takes하고 다음을 출력하는 method:[Priority <priority>] <text>std::string과doubletimestamp를 takes하고 다음을 출력하는 method:[<timestamp>s] <text>- 세 개의
std::stringparameters(sender, receiver, message)를 takes하고 다음을 출력하는 method:From <sender> to <receiver>: <message>
format()이어야 합니다. 컴파일러가 arguments에 따라 올바른 것을 선택합니다.- 단일
main.cpp: 네 개의 inputs를 읽습니다(각각 별도의 줄에 입력).- 간단한 message text
- priority level(integer)
- timestamp(double)
- sender name
Formatterobject를 Create하고 네 가지 overloaded methods를 모두 사용해 봅니다.- message text만 사용하여
format()을 Call합니다. - message text와 priority를 사용하여
format()을 Call합니다. - message text와 timestamp를 사용하여
format()을 Call합니다. - sender, receiver로서의 "Admin", 그리고 message text를 사용하여
format()을 Call합니다.
예를 들어, inputs가 System ready, 3, 12.5, Server인 경우:
Message: System ready
[Priority 3] System ready
[12.5s] System ready
From Server to Admin: System ready동일한 method name인 format()을 네 번 Call하지만, 각 Call이 arguments의 type과 개수에 따라 서로 다른 버전을 invoke한다는 점에 주목하세요. 이것이 바로 compile-time polymorphism이 동작하는 방식입니다. 프로그램이 실행되기도 전에 컴파일러가 사용할 overload를 결정합니다.
직접 해보기
#include <iostream>
#include <string>
#include "Formatter.h"
using namespace std;
int main() {
// 입력 읽기
string message;
getline(cin, message);
int priority;
cin >> priority;
double timestamp;
cin >> timestamp;
cin.ignore();
string sender;
getline(cin, sender);
// TODO: Formatter 객체 생성
// TODO: 메시지 텍스트만으로 format() 호출
// TODO: 메시지 텍스트와 priority로 format() 호출
// TODO: 메시지 텍스트와 timestamp로 format() 호출
// TODO: sender, 수신자로 "Admin", 메시지 텍스트로 format() 호출
return 0;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C++ 컴파일러