언리얼 엔진/개념 정리

개념 정리 - C++ (함수 오버로딩과 템플릿)

journey46110 2026. 7. 23. 21:21

I. 함수 오버로딩

1) 함수 오버로딩의 정의

같은 이름의 함수를 여러 개 만들되, 매개변수가 달라야 하는 것

void Print(int n)
{
    cout << n;
}

void Print(double d)
{
    cout << d;
}

Print(10);      // int 버전
Print(3.14);    // double 버전

 

 

2) Name Mangling

C++에서 함수 오버로딩이 가능한 이유

① C에서 함수를 기억하는 방식

Print(int a); //Print로 기억함

 

② C++에서 함수를 기억하는 방식

이를 Name Mangling이라고 함

Print(int a);
Print(double b);
Print(char c);

//컴파일러 내부에서 스스로 아래처럼 이름을 바꿔서 각각 다른 함수로 저장함
//Print_int, Print_double, Print_char

 

 

3) 오버로딩이 가능한 경우

① 매개변수 타입이 다를 때

void Print(int a);
void Print(double a);

 

② 매개변수 개수가 다를 때

void Print(int a);
void Print(int a, int b);

 

 

4) 오버로딩이 불가능한 경우

컴파일러가 어느 함수를 호출하는지 애매모호할 때 컴파일 에러가 일어남

① 호출 우선 순위가 같을 때

void Print(int a);
void Print(double a);

Print('A'); //char는 int와 double로 각각 손실이 없는 변환이 가능함

 

② 디폴트 매개변수가 있을 때

void Print(int a, int b = 10);
void Print(int a);

Print(10); //int b = 10의 디폴트 매개변수로 인해서 두 함수 다 호출이 가능함

 

③ 매개변수의 타입이 포인터와 배열의 차이 뿐일 때

void Print(int* arr);
void Print(int arr[]);

Print(arr); //포인터와 배열은 같은 타입으로 취급됨 int* arr == int arr[]

 

④ 함수의 반환형만 다를 때

int Add(int a, int b);
double Add(int a, int b);

Add(1, 2); //어느 함수를 호출해야할 지 애매모호함

 

 

5) 오버로딩 호출 우선 순위

우선 순위: 정확히 일치 -> 승격 변환 -> 표준 변환 -> 사용자 정의 변환

① 정확히 매개변수 타입이 일치

void Print(int a);
void Print(double a);

Print(10); //정확히 타입이 일치하는 int가 호출됨

 

② 타입 승격 변환

정보 손실이 없는 변환

char → int
short → int
float → double
bool → int

void Print(int a);
void Print(char a);

short s = 10;
print(s); //int로 타입 승격 변환이 가능함

 

③ 표준 타입 변환

정보 손실이 일어날 수 있는 변환

int → double
double → int
double → float

void Print(int a);
void Print(string a);

double num = 10.01;
Print(num); //int로 표준 타입 변환이 일어남

 

④ 사용자 정의 변환

클래스 생성자나 변환 연산자를 이용한 변환

class Number {
public:
    operator int() const { return 67; }
};

void Print(int a);
void Print(double a);

Number num;
print(num);  //사용자 정의 변환을 통해 Number→int로 변환됨

 

 

II. 템플릿

1) 템플릿의 필요성

동작은 같지만 반환형과 매개변수의 자료형만 다른 함수들

int Add(int a, int b);
double Add(double a, double b);
float Add(float a, float b);

템플릿은 자료형만 바뀌는 함수를 하나로 만들자는 취지에서 사용됨

 

장점

① 코드 중복 감소

② 유지보수 쉬움

③ 새로운 자료형도 바로 사용 가능

④ STL(vector, list, map 등)의 기반 기술

 

 

2) 사용법

함수 위에 이 문법을 적어줌

template<typename T>
혹은
template<class T>

 

예시

template<typename T>
T Add(T a, T b)
{
    return a + b;
}

Add(10,20);      //30 출력
Add(1.5,2.3);    //3.8 출력
Add('A','B');    //AB출력

컴파일러가 자료형과 반환형이 들어맞는 함수를 대신 만들어줌

 

 

3) 템플릿 클래스

함수뿐 아니라 클래스도 일반화할 수 있음

template<typename T>
class Array
{
private:
    T data[100];
    int size;

public:
    Array()
    {
        size = 0;
    }
    void Add(T value)
    {
        data[size++] = value;
    }
};

Array<int> numbers;
Array<string> names;
Array<double> scores;

같은 클래스인데 자료형만 달라짐

 

 

4) 함수 오버로딩 vs 템플릿

함수 오버로딩 템플릿
자료형마다 직접 함수 작성 하나의 함수만 작성
코드 중복 발생 코드 중복 감소
구현이 단순 범용적이고 재사용성 높음
자료형이 많아질수록 함수도 많아짐 자료형이 늘어나도 코드 그대로