같은 이름으로 다른 기능을 수행하는 함수를 만들 때 사용한다. 오버로딩을 사용하려면 호출되는 함수가 분명해야 한다.
C++에서 함수 이름이 같아도 매개변수의 타입이나 개수가 다르면 다른 함수로 구분한다.
오버로딩된 함수가 선택되는 순서
타입에 상관없이 일반화된 코드를 작성하기 위한 문법
template <typename T>: 어떤 타입이 올지 모르나 그 타입을 T로 부르겠다는 의미이다.
-> T add(T a, T b): int, double, float, short 뭐든 더하는 함수. 하지만 같은 typename에는 같은 타입이 들어간다.
// 목적: 클래스 템플릿으로 배열을 일반화하여 원소 추가 및 삭제 기능 구현하기
#include <iostream>
using namespace std;
template <typename T>
class Array {
T data[100];
int size;
public:
Array() : size(0) {}
void add(const T& element) {
if(size < 100)
data[size++] = element;
}
void remove() {
if(size > 0)
size--;
}
void 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;
}
// 출력결과:
// 10 20 30
// 10 20
🤔 템플릿과 별개로 위 코드에서 궁금점
arr.add(10); 처럼 입력에 상수가 들어갈 수 있는 이유
add(const T& element)<- 상수 참조이기 때문. const가 없었으면 rvalue를 받을 수 없다.
상수 참조(const reference)
🎯 왜 const T&는 rvalue를 받을 수 있을까?
예를 들어, arr.add(10);을 보면:
10은 rvalue로 메모리에 이름이 없는 임시 값이다.
add(const T& element)는 상수 참조이므로, C++ 표준에 따라 rvalue도 받을 수 있다.
컴파일러는 내부적으로 10을 임시 변수처럼 메모리에 저장한 뒤, 그 주소를 const T&로 전달한다.
add() 안에서 data[size++] = element;가 실행되면서 element의 값을 복사하게 된다.