Menu
Coddy logo textTech

함수 오버로딩

Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 104개 중 57번째.

함수 오버로딩(Function overloading)을 사용하면 이름은 같지만 매개변수 목록이 다른 여러 함수를 정의할 수 있습니다. 컴파일러는 사용자가 전달하는 인수를 기반으로 올바른 버전을 선택합니다. 이는 컴파일 타임 다형성의 핵심적인 형태입니다.

오버로딩이 작동하려면 함수는 시그니처(매개변수의 개수, 타입 또는 둘 다)가 달라야 합니다:

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)를 호출합니다

컴파일러는 각 호출을 검사하고 이를 적절한 오버로드에 일치시킵니다. 이 과정은 전적으로 컴파일 타임에 발생하므로, 런타임 오버헤드가 없습니다.

중요: 반환 형식만으로는 오버로드된 함수를 구분할 수 없습니다. 다음은 컴파일러 오류를 발생시킵니다:

int getValue();
double getValue();  // 오류: 반환 형식만으로는 오버로드할 수 없습니다

함수 오버로딩은 코드를 더 직관적으로 만들어 줍니다. addInts, addDoubles, addThreeInts와 같이 별도의 이름을 만드는 대신, 하나의 의미 있는 이름을 사용하고 나머지는 컴파일러가 처리하도록 합니다.

challenge icon

챌린지

쉬움

함수 오버로딩의 강력함을 보여주는 메시지 포맷터 클래스를 만들어 보겠습니다. 다양한 유형의 입력을 처리하는 여러 개의 format() 메서드를 가진 Formatter 클래스를 생성하게 됩니다. 컴파일러는 여러분이 전달하는 인수에 따라 적절한 버전을 선택하게 됩니다.

코드는 두 개의 파일로 구성됩니다:

  • Formatter.h: 다양한 시나리오를 처리하는 오버로딩된 format() 메서드를 가진 Formatter 클래스를 정의합니다:
    • 단일 std::string을 받아 Message: <text>를 출력하는 메서드
    • std::stringint 우선순위 레벨을 받아 [Priority <priority>] <text>를 출력하는 메서드
    • std::stringdouble 타임스탬프를 받아 [<timestamp>s] <text>를 출력하는 메서드
    • 세 개의 std::string 매개변수(sender, receiver, message)를 받아 From <sender> to <receiver>: <message>를 출력하는 메서드
    모든 메서드의 이름은 format()이어야 합니다. 컴파일러가 인수를 바탕으로 올바른 메서드를 선택할 것입니다.
  • main.cpp: 네 개의 입력을 읽습니다 (각각 별도의 줄에 입력됨):
    1. 단순 메시지 텍스트
    2. 우선순위 레벨 (정수)
    3. 타임스탬프 (실수)
    4. 발신자 이름

    Formatter 객체를 생성하고 네 가지 오버로딩된 메서드를 모두 시연합니다:

    • 메시지 텍스트만 사용하여 format() 호출
    • 메시지 텍스트와 우선순위를 사용하여 format() 호출
    • 메시지 텍스트와 타임스탬프를 사용하여 format() 호출
    • 발신자, 수신자로 "Admin", 그리고 메시지 텍스트를 사용하여 format() 호출

예를 들어, 입력값이 System ready, 3, 12.5, Server인 경우:

Message: System ready
[Priority 3] System ready
[12.5s] System ready
From Server to Admin: System ready

동일한 메서드 이름인 format()을 네 번 호출하지만, 각 호출이 인수의 타입과 개수에 따라 서로 다른 버전을 실행하는 방식에 주목하세요. 이것이 바로 컴파일 타임 다형성(compile-time polymorphism)의 실제 사례입니다. 컴파일러는 프로그램이 실행되기 전에 어떤 오버로드를 사용할지 결정합니다.

치트 시트

함수 오버로딩을 사용하면 이름은 같지만 매개변수 목록이 다른 여러 함수를 정의할 수 있습니다. 컴파일러는 컴파일 시점에 전달된 인수를 기반으로 올바른 버전을 선택합니다.

함수는 시그니처(signature), 즉 매개변수의 개수, 타입 또는 둘 다에서 차이가 있어야 합니다:

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);        // Calls add(int, int)
calc.add(2.5, 3.7);    // Calls add(double, double)
calc.add(1, 2, 3);     // Calls add(int, int, int)

중요: 반환 타입만으로는 오버로딩된 함수를 구분할 수 없습니다:

int getValue();
double getValue();  // Error: cannot overload by return type only

함수 오버로딩은 런타임 오버헤드가 없는 컴파일 타임 다형성의 한 형태입니다.

직접 해보기

#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;
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨