C++ 초급 - 4. 함수와 변수의 범위 (Functions and Variable Scope) (2 - 함수 오버로딩 (Function Overloading))

2025. 2. 12. 17:04프로그래밍 언어/C++

📌 4.2 함수 오버로딩 (Function Overloading)

함수 오버로딩(Function Overloading)같은 이름을 가진 여러 개의 함수를 정의할 수 있는 기능이다.
매개변수의 타입(type) 또는 개수(number)가 다르면, C++ 컴파일러는 이를 서로 다른 함수로 인식하여 적절한 함수를 호출한다.

이 기능을 활용하면 코드의 가독성을 높이고, 유지보수를 쉽게 할 수 있다.


📌 1. 함수 오버로딩의 기본 원칙

  1. 같은 함수 이름을 사용해야 함.
  2. 매개변수의 개수 또는 타입이 달라야 함.
  3. 반환 타입(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) 등