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 템플릿
| 함수 오버로딩 | 템플릿 |
| 자료형마다 직접 함수 작성 | 하나의 함수만 작성 |
| 코드 중복 발생 | 코드 중복 감소 |
| 구현이 단순 | 범용적이고 재사용성 높음 |
| 자료형이 많아질수록 함수도 많아짐 | 자료형이 늘어나도 코드 그대로 |
'언리얼 엔진 > 개념 정리' 카테고리의 다른 글
| 개념 정리 - C++ (메모리 관리) (0) | 2026.07.22 |
|---|---|
| 개념 정리 - C++ (상속, 다형성) (0) | 2026.07.17 |
| 개념 정리 - C++(클래스) (0) | 2026.07.10 |
| 개념 정리 - C++(포인터와 레퍼런스) (0) | 2026.07.09 |
| 개념 정리 - C++(조건문과 반복문) (0) | 2026.07.08 |