C++ 초급 - 4. 함수와 변수의 범위 (Functions and Variable Scope) (3 - 기본 매개변수 (Default Arguments))

2025. 2. 12. 18:14프로그래밍 언어/C++

📌 4.3 기본 매개변수 (Default Arguments)

기본 매개변수(Default Arguments)함수의 매개변수에 기본값을 설정하는 기능이다.
함수를 호출할 때 특정 매개변수를 생략하면 기본값이 자동으로 적용된다.

이 기능을 활용하면 코드를 간결하게 작성하고, 불필요한 함수 오버로딩을 줄일 수 있다.


📌 1. 기본 매개변수의 정의 및 사용법

🔹 기본 매개변수 선언 방식

반환타입 함수이름(매개변수 = 기본값);

💡 예제: 기본 매개변수 설정

#include <iostream>

// 함수 선언 (기본 매개변수 사용)
void greet(std::string name = "손님") {
    std::cout << "안녕하세요, " << name << "님!" << std::endl;
}

int main() {
    greet("홍길동");  // 매개변수 전달 → "홍길동" 사용
    greet();          // 매개변수 생략 → 기본값 "손님" 사용
    return 0;
}

🔹 출력 결과

안녕하세요, 홍길동님!
안녕하세요, 손님님!

💡 매개변수를 생략하면 기본값이 자동으로 적용됨.


📌 2. 기본값이 설정된 매개변수의 우선순위

  1. 기본 매개변수는 반드시 함수 선언(프로토타입)에서 설정해야 함.
  2. 기본 매개변수는 우측에서부터 차례로 설정해야 함.
    • 즉, 기본값이 설정된 매개변수 다음에 기본값이 없는 매개변수를 둘 수 없음.

💡 예제: 기본값의 우선순위

#include <iostream>

// 함수 선언 (기본값 설정)
void printMessage(std::string message, int repeat = 1) {
    for (int i = 0; i < repeat; i++) {
        std::cout << message << std::endl;
    }
}

int main() {
    printMessage("Hello!");   // 기본값 사용 (1번 출력)
    printMessage("Welcome!", 3); // repeat 값 전달 (3번 출력)
    return 0;
}

🔹 출력 결과

Hello!
Welcome!
Welcome!
Welcome!

💡 설명

  • 첫 번째 호출: repeat을 생략했으므로 기본값 1 적용.
  • 두 번째 호출: repeat = 3 전달.

📌 3. 기본 매개변수 설정 시 주의할 점

  1. 기본값은 마지막 매개변수부터 설정해야 함.
    void test(int a = 10, int b); // ❌ 오류 발생: 기본 매개변수는 오른쪽에서 왼쪽 순서로 설정해야 함.
    
  2. 기본값이 있는 매개변수와 없는 매개변수를 섞을 경우, 기본값 있는 매개변수를 뒤에 둬야 함.
    void test(int a, int b = 10); // ✅ 올바른 선언
    

📌 4. 오버로딩과 기본 매개변수의 차이점

기본 매개변수(Default Arguments)와 함수 오버로딩(Function Overloading)은 비슷하지만, 차이가 있다.

비교 항목 기본 매개변수 함수 오버로딩
코드 길이 간결함 코드가 길어짐
사용 방식 매개변수 생략 가능 같은 이름의 여러 함수 정의
유연성 일부 매개변수만 기본값 설정 가능 타입 또는 개수에 따라 다르게 동작 가능
충돌 가능성 기본 매개변수와 오버로딩을 혼용할 경우 충돌 가능 매개변수 타입과 개수가 다르면 명확히 구분됨

💡 기본 매개변수와 오버로딩 비교 예제

#include <iostream>

// 기본 매개변수 사용
void display(int a, int b = 10) {
    std::cout << "기본 매개변수: " << a << ", " << b << std::endl;
}

// 함수 오버로딩 사용
void display(int a) {
    std::cout << "오버로딩: " << a << std::endl;
}

int main() {
    display(5);   // display(int) 오버로딩 호출
    display(5, 20); // 기본 매개변수 사용
    return 0;
}

🔹 출력 결과

오버로딩: 5
기본 매개변수: 5, 20

💡 설명

  • display(5); 호출 시, 기본 매개변수를 사용하지 않고 오버로딩된 함수가 호출됨.
  • 오버로딩과 기본 매개변수를 혼용할 경우 컴파일러가 어떤 함수를 호출할지 모호해질 수 있음.

📌 5. C++ 표준 라이브러리에서의 활용 예시

C++ 표준 라이브러리에서는 기본 매개변수를 활용하여 유연한 함수 제공이 가능하다.

🔹 1. std::fill (배열 초기화)

#include <iostream>
#include <algorithm> // std::fill 사용

int main() {
    int arr[5];

    // 배열을 0으로 채우기 (기본 매개변수 사용)
    std::fill(arr, arr + 5, 0);

    for (int num : arr) {
        std::cout << num << " ";
    }
    return 0;
}

🔹 출력 결과

0 0 0 0 0

💡 설명

  • std::fill의 기본 매개변수로 배열을 특정 값으로 초기화할 수 있다.

🔹 2. std::sort (정렬)

#include <iostream>
#include <algorithm> // std::sort 사용

int main() {
    int arr[] = {5, 3, 9, 1, 4};

    // 기본 매개변수를 이용한 오름차순 정렬 (기본적으로 less<T>() 사용)
    std::sort(arr, arr + 5);

    for (int num : arr) {
        std::cout << num << " ";
    }
    return 0;
}

🔹 출력 결과

1 3 4 5 9

💡 설명

  • std::sort의 기본 매개변수는 std::less<T>()이므로 기본적으로 오름차순 정렬됨.

📌 6. 정리

개념 설명
기본 매개변수 함수의 매개변수에 기본값을 설정
설정 위치 기본값이 있는 매개변수는 오른쪽에서 왼쪽 순서로 설정해야 함
오버로딩과 차이점 기본 매개변수는 코드를 간결하게, 오버로딩은 유연하게
주의점 오버로딩과 기본 매개변수를 혼용하면 충돌 가능성 있음
활용 예시 std::fill, std::sort 등 표준 라이브러리에서 활용