2025. 2. 12. 17:04ㆍ프로그래밍 언어/C++
📌 4.2 함수 오버로딩 (Function Overloading)
함수 오버로딩(Function Overloading)은 같은 이름을 가진 여러 개의 함수를 정의할 수 있는 기능이다.
매개변수의 타입(type) 또는 개수(number)가 다르면, C++ 컴파일러는 이를 서로 다른 함수로 인식하여 적절한 함수를 호출한다.
이 기능을 활용하면 코드의 가독성을 높이고, 유지보수를 쉽게 할 수 있다.
📌 1. 함수 오버로딩의 기본 원칙
- 같은 함수 이름을 사용해야 함.
- 매개변수의 개수 또는 타입이 달라야 함.
- 반환 타입(return type)은 오버로딩을 구분하는 기준이 될 수 없음.
💡 기본 문법
반환타입 함수이름(매개변수1);
반환타입 함수이름(매개변수2);
📌 2. 함수 오버로딩 예제
(1) 매개변수 타입을 이용한 오버로딩
#include <iostream>
// 정수형 덧셈 함수
int add(int a, int b) {
return a + b;
}
// 실수형 덧셈 함수 (매개변수 타입이 다름)
double add(double a, double b) {
return a + b;
}
int main() {
std::cout << "정수 덧셈: " << add(3, 4) << std::endl; // int add(int, int) 호출
std::cout << "실수 덧셈: " << add(2.5, 1.5) << std::endl; // double add(double, double) 호출
return 0;
}
🔹 출력 결과
정수 덧셈: 7
실수 덧셈: 4
💡 매개변수 타입이 다르면, 같은 이름의 함수를 정의할 수 있다.
→ 정수(int)와 실수(double) 입력에 따라 다른 함수가 호출됨.
(2) 매개변수 개수를 이용한 오버로딩
#include <iostream>
// 두 개의 숫자를 더하는 함수
int add(int a, int b) {
return a + b;
}
// 세 개의 숫자를 더하는 함수 (매개변수 개수 다름)
int add(int a, int b, int c) {
return a + b + c;
}
int main() {
std::cout << "두 개 덧셈: " << add(3, 4) << std::endl; // add(int, int) 호출
std::cout << "세 개 덧셈: " << add(1, 2, 3) << std::endl; // add(int, int, int) 호출
return 0;
}
🔹 출력 결과
두 개 덧셈: 7
세 개 덧셈: 6
💡 매개변수 개수가 다르면, 같은 이름의 함수를 정의할 수 있다.
→ 매개변수 개수에 따라 적절한 함수가 호출됨.
(3) 매개변수 순서를 이용한 오버로딩
#include <iostream>
// 정수와 실수를 곱하는 함수
double multiply(int a, double b) {
return a * b;
}
// 실수와 정수를 곱하는 함수 (매개변수 순서가 다름)
double multiply(double a, int b) {
return a * b;
}
int main() {
std::cout << "정수 × 실수: " << multiply(3, 2.5) << std::endl; // multiply(int, double) 호출
std::cout << "실수 × 정수: " << multiply(2.5, 3) << std::endl; // multiply(double, int) 호출
return 0;
}
🔹 출력 결과
정수 × 실수: 7.5
실수 × 정수: 7.5
💡 매개변수의 순서가 다르면, 같은 이름의 함수를 정의할 수 있다.
→ 호출되는 매개변수의 순서에 따라 적절한 함수가 실행됨.
📌 3. 함수 오버로딩의 주의점
(1) 반환 타입만 다르면 오버로딩이 불가능
#include <iostream>
// 반환 타입이 다르지만, 매개변수가 동일하여 오류 발생
int func(int a) { return a + 10; }
double func(int a) { return a + 10.5; } // ❌ 오류: 오버로딩 불가능
int main() {
std::cout << func(5) << std::endl;
return 0;
}
🔹 컴파일 오류 발생
error: ambiguating new declaration of 'double func(int)'
💡 반환 타입(return type)은 오버로딩을 구분하는 기준이 될 수 없다!
→ 반드시 매개변수의 타입 또는 개수를 다르게 설정해야 함.
(2) 기본 매개변수 (Default Arguments)와 오버로딩 충돌
기본 매개변수(default arguments)가 포함된 함수는 오버로딩과 충돌할 가능성이 있으므로 주의해야 한다.
#include <iostream>
// 기본 매개변수가 포함된 함수
void printMessage(std::string msg = "Hello") {
std::cout << msg << std::endl;
}
// 동일한 함수 이름의 오버로딩 (매개변수 없음)
void printMessage() { // ❌ 오류 발생
std::cout << "No Message" << std::endl;
}
int main() {
printMessage(); // 어느 함수를 호출해야 할지 모호함
return 0;
}
🔹 컴파일 오류 발생
error: redefinition of 'void printMessage()'
💡 기본 매개변수를 사용할 경우, 오버로딩과 충돌할 수 있음!
→ 기본 매개변수는 오버로딩 없이 활용하거나, 조합에 주의해야 한다.
📌 4. 함수 오버로딩 활용 예제
(1) std::abs 함수 (절댓값 계산)
C++ 표준 라이브러리에서는 같은 이름의 함수(std::abs)를 오버로딩하여 int, double, float 등의 데이터 타입을 지원한다.
#include <iostream>
#include <cmath> // abs 함수 사용
int main() {
std::cout << "정수 절댓값: " << std::abs(-10) << std::endl; // int
std::cout << "실수 절댓값: " << std::abs(-5.7) << std::endl; // double
return 0;
}
🔹 출력 결과
정수 절댓값: 10
실수 절댓값: 5.7
💡 C++ 표준 라이브러리는 같은 이름의 함수를 오버로딩하여 다양한 데이터 타입을 지원한다.
📌 5. 정리
구분 | 설명 |
함수 오버로딩 | 같은 이름을 가진 여러 개의 함수를 정의 가능 |
오버로딩 기준 | 매개변수의 타입(type) 또는 개수(number)가 달라야 함 |
구별 불가능한 경우 | 반환 타입이 다르기만 하면 오류 발생 |
활용 예시 | std::abs(int), std::abs(double) 등 |