Language/C++

[C++] Template(템플릿)

검은 까마귀 2024. 1. 23. 11:29

# Generic Programming

기존에 공부했던 JAVA에서는 제네릭 문법이 잇었다.

2022.01.10 - [Language/Java] - [JAVA] 제네릭(Generic)

 

[JAVA] 제네릭(Generic)

제네릭이란 데이터의 타입을 일반화 한다 제네릭은 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법 클래스나 메소드 내부에서 사용되는 객체의 타입 안정성

blaj2938.tistory.com

 

여기서 말하는 Generic은 Generic Programming에서 나온 것이다. 그 정의가 무엇이냐면, 프로그래밍 언어에서 타입에 구애 받지 않고 재사용이 가능한 코드를 작성하는 이론을 이야기 하는 것이다.

 

C++ 들어가기전 친숙한 JAVA의 Generic이 어떤건지 보겠다.

List<Integer> intList = new ArrayList<>();
List<String> strList = new ArrayList<>();

Queue<Interger> queue = new LinkeList<>();
Queue<String> queue = new LinkeList<>();

 

사실 Generic을 만들어서 쓸 수도 있지만 JAVA에서도 자주 쓰이는 것들을 들고 왔다. 그러면 C++에서는 어떤 방식으로 쓰일까?

# Template(템플릿)

C++에서 Generic 프로그래밍을 구현하기 위해서는 Template를 사용한다.

Template이란, Generic 프로그래밍의 정의에 따라 매개변수 타입에 따라 Fuction이나 Class를 생성하는 매커니즘을 이야기한다. Template은 타입이 매개변수로 표현되기 때문에 Paramerterized type이라고 불리기도 한다. Template을 사용하면 재사용 가능한 코드를 만들어낼 수 있게된다.

# Function Template

C++에서 함수 템풀릿이란 함수의 일반화된 선언을 의미하게 된다. 같은 알고리즘을 사용하는 함수를 정의한다는 개념으로 이해하면 쉽다.

#include <iostream>
using namespace std;

template <typename T> //typename 키워드로 선언
void Swap(T& a, T& b);

int main(void)
{
	int c = 2, d = 3; //다른 매개변수가 들어갈 수 있다.
	cout << "c : " << c << ", d : " << d << endl;
	Swap(c, d);
	cout << "c : " << c << ", d : " << d << endl;
	
	string e = "hong", f = "kim"; //다른 매개변수가 들어갈 수 있다.
	cout << "e : " << e << ", f : " << f << endl;
	Swap(e, f);
	cout << "e : " << e << ", f : " << f << endl;
	return 0;
}

template <typename T>
void Swap(T& a, T& b) 
{
	T temp;
	temp = a;
	a = b;
	b = temp;	
}

 

위처럼 함수를 명시적으로 선언할 수 있다. 또한 특수한 경우 변수를 정의해줘서 해당 정의된 변수에서만 함수가 돌아갈 수 있도록 가능하다. 아래는 double타입의 변수에서 동작할때 아무것도 동작하지 않도록 한다.

#include <iostream>
using namespace std;

template <typename T>
void Swap(T& a, T& b);

template <> void Swap<double>(double&, double&);

int main(void)
{
	int c = 2, d = 3;
	cout << "c : " << c << ", d : " << d << endl;
	Swap(c, d);
	cout << "c : " << c << ", d : " << d << endl;
	
	double e = 1.234, f = 4.321;
	cout << "e : " << e << ", f : " << f << endl;
	Swap(e, f);
	cout << "e : " << e << ", f : " << f << endl;
	return 0;
}

template <typename T>
void Swap(T& a, T& b)
{
	T temp;
	temp = a;
	a = b;
	b = temp;	
}

template <> void Swap<double>(double&, double&)
{
	// double형은 값을 서로 바꾸지 않음. 
}

# Class Template

함수 템플릿과 마찬가지로 클래스 템플릿도 코드 재사용성을 줄여준다.

#include <iostream>
using namespace std;

template <typename T>
class Data
{
private:
	T data_;
public:
	Data(T dt);
	T get_data();
};

int main(void)
{
	Data<string> str_data("C++ 수업");
	Data<int> int_data(12);
	
	cout << "str_data : " << str_data.get_data() << endl;	
	cout << "int_data : " << int_data.get_data() << endl;
	return 0;
}

template <typename T>
Data<T>::Data(T dt)
{
	data_ = dt;
}

template <typename T>
T Data<T>::get_data()
{
	return data_;
}

 

클래스를 선언하고 다른 자료형인 string, int형을 넣어도 클래스 템플릿으로 선언했을때 동작하게 된다.


템플릿은 단순하게 이야기해서 개발자들이 좋아하는 코드 중복사용안하기를 위해 만들어진 문법이다. 내용을 이해하는데는 그렇게 어렵지 않았다. JAVA에서도 제네릭을 활용하는 것처럼 C++에서도 템플릿을 활용하기 때문이다. 물론 두 언어의 차이는 명확하기때문에 동작하는 원리 자체가 다르다. 하지만 내가 말하고 싶은바는 추구하는 목표는 같다는 것이다.

 

다음 포스팅에서는 표준 템플릿 라이브러리에서 알아보겠다.(코테해야지....!) 

 

 

# 참고 문헌

https://tcpschool.com/cpp/cpp_template_class

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

 

반응형