c++ 챕터 2(2)

김민재·2025년 1월 11일
0

메소드(함수) 오버로딩

일반적으로 함수 오버로딩이 되려고하면 매개변수 타입이 다르거나, 매개변수의 갯수가 다른 경우가 일반적이다.

만약 같은 타입,메소드(함수)명, 같은 수의 매개변수를 가지는 함수들이 여러개 있을 때 과연 어떻게 구분을 해야만 할까?

#include <iostream>
using namespace std;

// 정수 반환
int getValue() {
    return 42;
}

// 동일한 함수 이름으로 반환 타입만 다름 -> 컴파일 에러 발생
double getValue() {
    return 3.14;
}

int main() {
    cout << getValue() << endl; // 어떤 함수를 호출해야 할지 모호
    return 0;
}

반환 타입이 다른 경우에 어떤 함수를 호출하는지 정확하게 알 수 없어서 컴파일 에러가 발생한다.

#include <iostream>
using namespace std;

void printMessage(string message = "Default") {
    cout << "문자열 출력: " << message << endl;
}

void printMessage() {
    cout << "기본 메시지 출력" << endl;
}

int main() {
    printMessage(); // 모호성 발생 -> 컴파일 에러
    return 0;
}

default 값을 정하고 하더라도 값이 존재하지 않는 경우에 어떤 것을 호출해야 할지 모르기 때문에 에러가 난다.

#include <iostream>
using namespace std;

void process(int* arr) {
    cout << "포인터를 처리하는 함수" << endl;
}

void process(int arr[]) {
    cout << "배열을 처리하는 함수" << endl;
}

int main() {
    int numbers[] = { 1, 2, 3 };
    process(numbers); // 포인터와 배열 구분 불가 -> 컴파일 에러
    return 0;
}

포인터와 배열 매개변수를 서로 구분할 수 없어서 생기는 문제이다.

제네릭 함수(템플릿)

함수나 클래스를 일반화시켜, 매개변수 타입을 직접 지정하여 함수나 클래스 코드를 생산하는 기법이다.

#include <iostream>
using namespace std;

template <typename T>
T add(T x, T y) {
    return x + y;
}

int main() {
    cout << add(3, 4) << endl;         // 정수형 덧셈
    cout << add(3.3, 4.2) << endl;     // 실수형 덧셈

    return 0;
}

이렇게 template을 선언하여 각 템플릿으로 함수나 클래스의 타입을 결정하는 방식이다.
이런식으로 하게되면 함수 오버로딩에서 발생하는 문제가 발생하지 않게 된다.

profile
ㅇㅇ

0개의 댓글