코딩 학습/C와 C++

C++ 기초 - 템플릿

이개 2026. 3. 11. 20:13

템플릿

  • 서로 다른 자료형에 유연하게 대응하는 일반화된 코드를 작성하는 방법
  • 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