프로그래밍 언어/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로 타입 변경 | 원래 타입과 동일하게 처리 | ❌ |
함수 포인터 할당 | 명확한 타입 지정 필요 | ⚠️ 조건부 가능 |