본문 바로가기

나의 SW개발 이야기/SW개발 일반

Class Template 클래스 템플릿

Class Template


1. 용도

Class를 정의 할 때, 

멤버의 형식, 혹은 메서드의 파라미터(인수)의 형식 (여기서 말하는 형식은 Datatype)만 다르고


나머지 클래스 내부의 논리전개가 동일할 때, 각 datatype별로 클래스를 제각각 정의하는 것은 뭔가 비효율적으로 보인다.

만약 내부적인 논리 전개에 문제가 있거나 동작이 수정될 필요가 있을 경우, 각각 정의 된 클래스를 일일이 다 수정해야 한다.

소스코드 상에서 고정부/변동부로 나누고, 중복되는 코드를 줄일 수 있다면 효율적인 코딩이 될 수 있지 않을까.



Stack 이란 클래스를 정의하고자 할 때, 만약 int, float, long, double 등 각각의 datatype에 상관없이 stack을 정의 할 때

template을 쓰면 간단히 해결 된다.


Queue, Stack, Tree 등에서 쓰이는 Element들(node? 등 자료구조 구성 요소들)은 그 타입을 클래스 내부에서 정해버리면, 그 자료형만 쓸 수 있다.

만약 다른 자료형(datatype)으로 동작하게 하고 싶다면, 일일이 그 클래스를 따로 정의 해야하는 불편함과 동시에, 내부 구조의 수정이 필요한 경우 일일이 다 수정을 해줘야 하는 불편함이 있다.



2. 사용상 유의점

* 컴파일러가 template을 보고 필요한 코드를 generate한다. 따라서 이를 위해서 template코드는 header에 작성해야 한다.

* 클래스의 멤버 함수를 정의 할 때 클래스의 외부에 멤버함수를 작성하려면 각 멤버함수 별로 template <typename T> 를 추가해야 한다.

typename T가 무엇인지 알려줘야 하기 때문. 클래스 내부에 작성이 된다면 scoping rule에 의해 datatype T를 굳이 알려줄 필요가 없다.




3. Trivia

* 물론 readability(가독성)은 무척 떨어진다. 하지만 계속 쳐다보면 눈에 익기는 한다.

하지만 template은 늘 그렇듯이 예전에 공부해서 이해를 다 했다고 생각해도

다시 생소한 코드에 template이 있으면 눈에 잘 들어오지 않는다.


* 컴파일러가 코드를 Generate하기 때문에 코드량이 줄어서 생기는 Execution time의 효율은 기대하기 어렵다. 어짜피 코드는 다 생성이 되니까


코드를 줄인다고 가독성이 좋아지지 않는 아주 좋은 예 인 것 같다.