프로그래밍 언어/C++

C++ 함수 오버로딩 - 2. 함수 오버로딩의 기본 규칙

개발_노트 2025. 3. 26. 20:57

 

✅ 2. 함수 오버로딩의 기본 규칙

함수 오버로딩이 제대로 작동하려면 컴파일러가 각 함수 버전을 명확히 구분할 수 있어야 하며, 이를 위해 몇 가지 중요한 규칙을 지켜야 합니다.


📌 2-1. 동일한 함수 이름 사용

  • 오버로딩의 전제 조건은 함수 이름이 완전히 같아야 한다는 점입니다.
  • 이름이 다르면 전혀 다른 함수로 인식되며, 오버로딩이 적용되지 않습니다.
void print(int a);       // ✅ 오버로딩 대상
void print(double a);    // ✅ 이름 같고 매개변수 타입 다름 → 오버로딩 가능

void display(int a);     // ❌ 이름 다름 → 오버로딩 아님

📌 2-2. 매개변수의 개수 또는 타입이 달라야 함

  • 함수의 매개변수 목록(parameter list)이 달라야 오버로딩이 가능합니다.
  • 개수, 타입, 순서가 다르면 서로 다른 함수로 인식됩니다.

✔ 개수가 다른 경우

void add(int a, int b);
void add(int a, int b, int c); // ✅ 오버로딩 가능

✔ 타입이 다른 경우

void print(int value);
void print(double value);      // ✅ 오버로딩 가능

⚠ 매개변수 이름은 무시됨

void show(int x);
void show(int y);   // ❌ 이름만 다르고 타입은 같음 → 중복 정의 오류

📎 참고: typedef와 오버로딩

  • typedef 또는 using으로 타입에 별칭을 붙여도, 컴파일러는 원래 타입과 동일하게 인식합니다.
typedef int MyInt;

void func(int a);
void func(MyInt a);   // ❌ 오버로딩 아님 → int와 동일한 타입

🔍 typedef는 코드를 더 읽기 쉽게 만드는 도구일 뿐, 타입 자체를 새롭게 정의하는 것이 아닙니다.


📌 2-3. 반환 타입만 다른 경우는 오버로딩 불가

  • 함수의 반환 타입(return type)만 다른 경우, 오버로딩은 불가능합니다.
  • 컴파일러는 매개변수 목록만으로 함수 버전을 구분하므로, 반환 타입은 오버로딩 기준이 되지 않습니다.
int getValue();      
double getValue();   // ❌ 매개변수 동일 → 중복 정의 오류

✔ 해결 방법

int getValue();             
double getValue(bool flag);  // ✅ 매개변수가 다르므로 오버로딩 가능

📌 보충: 함수 포인터와 오버로딩

  • 오버로딩된 함수는 이름만으로는 어떤 버전인지 컴파일러가 알 수 없음.
  • 함수 포인터에 오버로딩된 함수를 할당하려면 정확한 시그니처를 명시해야 함.
void func(int a) { cout << "int\n"; }
void func(double a) { cout << "double\n"; }

int main() {
    void (*fp)(int) = func;   // ✅ 명확한 시그니처로 int 버전 지정
    fp(10);  // 출력: int

    // void (*fp2)() = func; // ❌ 컴파일 오류: 어떤 버전인지 모호함
}

🧠 요약 정리표

규칙 항목 설명 오버로딩 가능 여부
함수 이름 같아야 함 ✅ 필요 조건
매개변수 개수 다르면 가능
매개변수 타입 다르면 가능
매개변수 이름만 다름 컴파일러 무시함
반환 타입만 다름 구분 불가
typedef로 타입 변경 원래 타입과 동일하게 처리
함수 포인터 할당 명확한 타입 지정 필요 ⚠️ 조건부 가능