전체 코드

1. 함수 오버로딩(Overloading)

🔹 함수 오버로딩이란?

  • 같은 이름의 함수를 매개변수의 개수나 타입을 다르게 하여 여러 개 정의하는 것.
  • 함수 이름의 재사용을 가능하게 하여 코드의 가독성과 유지보수성을 향상.
  • 반환형(return type)만 다르게 하면 오버로딩이 불가능!

📌 함수 오버로딩 예제

#include <iostream>
using namespace std;

// 함수 오버로딩 (중복 정의: 같은 함수 이름, 다른 매개변수)

// 1. 두 개의 정수를 더하는 함수
int Add(int a, int b) {
    return a + b;
}

// 2. 한 개의 정수를 받아 1을 더하는 함수
int Add(int a) {
    return a + 1;
}

// 3. 두 개의 실수를 더하는 함수
float Add(float a, float b) {
    return a + b;
}

int main() {
    // 정수 덧셈
    int result1 = Add(1, 2);  
    cout << "Add(1, 2) = " << result1 << endl;  // 3 출력

    // 단일 정수 덧셈 (기본 값 1 추가)
    int result2 = Add(5);    
    cout << "Add(5) = " << result2 << endl;  // 6 출력

    // 실수 덧셈
    float result3 = Add(1.5f, 2.1f);  
    cout << "Add(1.5f, 2.1f) = " << result3 << endl;  // 3.6 출력

    return 0;
}

📌 실행 결과

Add(1, 2) = 3
Add(5) = 6
Add(1.5f, 2.1f) = 3.6

📌 함수 오버로딩 규칙

오버로딩 가능 여부설명
가능매개변수 개수가 다름 (int Add(int) vs. int Add(int, int))
가능매개변수 타입이 다름 (int Add(int, int) vs. float Add(float, float))
불가능반환형만 다름 (int Add(int, int) vs. float Add(int, int))

2. 기본 인자값(Default Parameters)

🔹 기본 인자값이란?

  • 함수의 매개변수에 기본값을 설정하면 인자를 생략했을 때 기본값이 자동으로 사용됨.
  • 항상 마지막 매개변수부터 기본값을 설정해야 함.

📌 기본 인자값 예제

// 플레이어 정보 설정 함수
void SetPlayerInfo(int hp, int mp, int attack, int guildId = 0, int castleId = 2) {
    cout << "hp: " << hp << endl;
    cout << "mp: " << mp << endl;
    cout << "attack: " << attack << endl;
    cout << "guildId: " << guildId << endl;
    cout << "castleId: " << castleId << endl;
}

int main() {
    // 기본 인자값이 있는 함수 호출
    SetPlayerInfo(100, 40, 10);  // guildId = 0, castleId = 2 자동 설정
    cout << endl;

    SetPlayerInfo(120, 50, 20, 1);  // castleId = 2 자동 설정
    cout << endl;

    SetPlayerInfo(150, 60, 30, 3, 5);  // 모든 인자 지정

    return 0;
}

📌 실행 결과

hp: 100
mp: 40
attack: 10
guildId: 0
castleId: 2

hp: 120
mp: 50
attack: 20
guildId: 1
castleId: 2

hp: 150
mp: 60
attack: 30
guildId: 3
castleId: 5

📌 기본 인자값 사용 규칙

  1. 기본값은 마지막 매개변수부터 적용해야 한다.

    void SetPlayerInfo(int hp, int mp, int attack, int guildId = 0, int castleId = 2);
    • void SetPlayerInfo(int hp, int guildId = 0, int mp); (중간에 기본값 설정 불가!)
  2. 특정 매개변수만 기본값을 사용하고 싶을 때, 앞의 매개변수들도 반드시 입력해야 한다.


3. 스택 오버플로우(Stack Overflow)와 재귀 함수(Recursive Function)

🔹 스택 오버플로우란?

  • 함수 호출 시, 호출 정보가 스택(Stack) 메모리에 저장됨.
  • 재귀 함수가 종료 조건 없이 계속 호출되면 스택 메모리가 초과되면서 스택 오버플로우 발생.

📌 팩토리얼(Factorial) 재귀 함수 예제

// 팩토리얼 계산 함수 (재귀)
int Factorial(int n) {
    if (n <= 1)  // 종료 조건 (Base Case)
        return 1;

    return n * Factorial(n - 1);  // 재귀 호출 (Recursive Case)
}

int main() {
    int result = Factorial(5);  // 5! = 5 * 4 * 3 * 2 * 1 = 120
    cout << "5! = " << result << endl;

    return 0;
}

📌 실행 결과

5! = 120

🔹 스택 오버플로우 발생 예제

int Factorial(int n) {
    return n * Factorial(n - 1);  // 종료 조건 없음! (무한 재귀)
}

int main() {
    int result = Factorial(100000);  // 매우 큰 값으로 테스트
    cout << result << endl;

    return 0;
}

🚨 결과: 스택 오버플로우 발생!
"Stack Overflow" 오류가 발생하며 프로그램이 강제 종료됨.

📌 스택 오버플로우 해결 방법

  • 기저 조건(Base Case) 추가 → 종료 조건이 있어야 무한 재귀를 방지!
  • 반복문 사용 (재귀 대신 for 문 활용)
  • 꼬리 재귀 최적화(Tail Recursion Optimization) (C++에서는 자동 최적화가 어렵지만 일부 컴파일러에서 지원)

profile
李家네_공부방

0개의 댓글