템플릿
- 서로 다른 자료형에 유연하게 대응하는 일반화된 코드를 작성하는 방법
- template<typename T> 형식
- int와 double을 한 함수로 계산하는 코드
#include <iostream>
#include <memory>
using namespace std;
template <typename T>
T add(T a, T b) {
return a + b;
}
int main() {
cout << add(3, 5) << endl; // 정수 더하기
cout << add(2.5, 4.1) << endl; // 실수 더하기
// 두 인자가 다른 타입이면 연산 불가능!!
return 0;
}
- 문자열 크기 비교시에는 사전순으로 앞글자부터 비교한다.
- 인자 중 일부만 템플릿으로 받아도 된다.
#include <iostream>
#include <memory>
using namespace std;
template <typename T>
void printArray(T arr[], int size) {
for (int i = 0; i < size; i++) {
cout << arr[i] << " ";
}
cout << endl;
}
int main() {
int intArr[3] = { 1, 2, 3 }; // 정수 배열 출력
char charArr[4] = { 'A', 'B', 'C', 'D' };
printArray(intArr, 3);
printArray(charArr, 4);
return 0;
}
템플릿 클래스
- 클래스도 템플릿으로 일반화 가능
함수 오버로딩
- C에서는 함수 오버로딩이 안되지만, C++ 에서는 가능
- 함수 오버로딩이 유효해지는 조건
- 매개변수 타입이 다른 경우
- 매개변수의 개수가 다른 경우
- 오버로딩이 되지 않는 경우
- 타입 변환이 가능한 매개변수로 인해 두 개 이상의 오버로딩된 함수가 호출 후보가 되는 경우
- A(double a)과 A(long a)로 함수 오버로딩을 했는데, A(10)처럼 double과 long 둘 다 가능한 int값으로 호출하는 경우
- 디폴트 매개변수로 인해 함수 호출 형태가 중복되는 경우
- A(int a, int b=5)와 A(int a) 가 있고, A(10)을 호출한 경우
- 매개변수의 타입만 포인터와 배열로 다른 경우
- A(int* arr), A(int arr[])은 같은 타입으로 취급되어 모호해짐
- 함수의 반환 타입만 다른 경우
- 타입 변환이 가능한 매개변수로 인해 두 개 이상의 오버로딩된 함수가 호출 후보가 되는 경우
함수 오버로딩의 순서
- 우선순위 규칙
- 정확한 매칭 -> 타입 승격 변환 -> 표준타입 변환 -> 사용자 정의 타입 변환
- 호출 인자 타입과 매개변수 타입이 정확히 일치하는 경우, 제일 먼저 호출
- 값이 손실되지 않는 방향으로 변환하는 타입 승격 변환이 그 다음
- char or short -> int
- float -> double
- bool -> int
- 값 손실이 발생할 수 있는 조금더 광범위한 표준 타입 변환이 그 다음
- int -> double
- double -> int
- double -> float
- 마지막으로 클래스 타입의 변환 함수나 생성자 등을 통해 이뤄지는 사용자 정의 타입 변환
- operator 연산자 사용
- operator int() const {} <- 이 객체를 int로 변환할 수 있다는 뜻
- const는 객체 상태를 변경하지 않는다는 뜻으로 쓰이며, const 객체에서도 호출 가능하게 해줌.
- 자동 형변환이 너무 많이 일어날 수 있으므로 explicit operator int() const로 대체하여 명시적 형변환만 가능하게 쓰는 게 좋음
- explicit 붙이면 int a = (int)s; 또는 int a = static_cast<int>(s); 형식으로만 형변환 가능
'코딩 학습 > C와 C++' 카테고리의 다른 글
| C++ 헷갈리는 개념 정리 (0) | 2026.03.13 |
|---|---|
| C++ 기초 오답노트 / 기능 정리 (0) | 2026.03.12 |
| C++ 기초 - 자원 관리 (0) | 2026.03.10 |
| C++ 기초 - Vector, Map (0) | 2026.03.09 |
| C++ 기초 - 클래스 (0) | 2026.03.06 |