- 순서
- 함수 오버로딩
- 템플릿
- 함수 오버로딩
- 함수 오버로딩: 컴파일러가 매개변수의 타입과 개수를 기준으로 같은 이름의 함수들을 구분할 수 있도록, 네임 맹글링하여 여러 개 정의할 수 있게 하는 것.
- 네임 맹글링(Name Mangling): 함수 이름 구분을 위해 내부적으로 고유한 이름을 부여하는 것 (단, 함수의 반환형만으로는 오버로딩이 성립하지 않음)
- C언어와 다르게 C++에서는 오버로딩을 통해 동일한 이름의 함수를 여러 개 정의할 수 있음. => C는 함수 이름으로만 함수를 구분하지만, C++은 함수 이름과 매개변수 타입 정보를 함께 사용해 구분하기 때문
- 함수 오버로딩이 유효해지는 조건
- 매개변수 타입이 다른 경우
- 매개변수의 개수가 다른 경우
- 함수 오버로딩 호출
- 함수 오버로딩이 되려면, 호출되는 함수가 분명해야함.
- 호출 시점에 호출할 함수가 명확하지 않으면 컴파일러는 애매모호성 오류를 발생시킴.
- 타입 변환이 가능한 매개변수로 인해 두 개 이상의 오버로딩된함수가 호출 후보가 되는 경우
- 디폴트 매개변수로 인해 함수 호출 형태가 중복되는 경우
- 매개변수의 타입만 포인터와 배열로 다른 경우
- 함수의 반환 타입만 다른 경우
- 함수 오버로딩의 순서
- C++에서는 아래 이미지와 같은 우선순위 규칙에 따라 호출할 함수를 결정함

- 정확한 매개변수 타입 일치: 호출 인자 타입과 매개변수 타입이 정확히 일치하는 경우
- 타입 승격 변환: 값이 손실되지 않는 방향으로 변환하는 것을 승격이라고 함
- ex) char or short => int, float => double, bool => int
- 표준 타입 변환: 승격보다는 조금 더 광범위하며 값 손실이 발생하는 경우도 있음
- ex) int => double, double => int, double => float
- 사용자 정의 타입 변환: 클래스 타입의 변환 함수나 생성자 등을 통해 이뤄지는 변환
-
-
- 템플릿
- 타입에 관계없이 일반화된 코드를 작성하기 위한 문법
- 템플릿을 이용한 일반화된 함수는 template <typename T>와 같은 형태로 정의함
- template <typename T>의 의미는 어떤 타입이 올지 모르겠으나, 들어 올 타입을 T라고 부르겠다는 의미이다. 이후 일반화하려는 타입 자리에 실제 타입 대신 T를 사용하면 됨.
- 아래 이미지와 같이 두 개의 정수를 더하는 함수가 3개를 오버로딩 하는 대신 하나의 템플릿 함수로 정의할 수 있음

- 템플릿 클래스
- 함수뿐만 아니라, 클래스도 템플릿으로 사용해 일반화할 수 있음. ex) 배열에 원소를 추가하고 삭제하는 기능을 가진 클래스를 정의할 때도 템플릿을 활용하여 다양한 타입의 데이터에 대해 동작하도록 일반화할 수 있음.
#include <iostream>
using namespace std;
template <typename T>
class Array {
private:
T data[100];
int size;
public:
Array() : size(0) {}
void add(const T& element);
void remove();
void print();
};
template <typename T>
void Array<T>::add(const T& element) {
if (size < 100) {
data[size++] = element;
}
}
template <typename T>
void Array<T>::remove() {
if (size > 0) {
size--;
}
}
template <typename T>
void Array<T>::print() {
for (int i = 0; i < size; i++) {
cout << data[i] << "";
cout << endl;
}
}
int main() {
Array<int> arr;
arr.add(10);
arr.add(20);
arr.add(30);
arr.print();
arr.remove();
arr.print();
return 0;
}