전 개인적으로 템플릿을 좋아합니다.
템플릿과 비템플릿 기법을 두고 했을때는 왠만하면 템플릿을
사용하는걸 추구하는 편입니다.
그러다 보니 자주 듣는말이 "그 보기 힘든걸 왜 좋아하냐?",
"템플릿은 남발하면 안된다." 라는 말이 대부분이더군요.
우선 간단한 이유인 "템플릿은 남발하면 안된다"라는 거에 대한 대답은
남발해야지 많은곳에 해볼수 있기 때문입니다.
그냥 새로운걸 해보자는 시도지요. 그리고 개인적으로 공부하다보니
남에 눈치를 안봐도 되는 경향도 있지요.
그리고 가장 중요한 이유는 아래 좋아하는 이유에 대한 설명을 보시면
이해가 되실것으로 예상됩니다.
그럼 다음 질문인 "그 보기 힘든걸 왜 좋아하냐?"라는 질문입니다.
저도 템플릿은 처음 본건 AI Programming Wisdom 이라는 책이었는데
처음 본순간 외계프로그래밍언어가 아닐까 생각이 들었었습니다.
그러던중에 Accelerated C++을 보고 STL에 대한 설명과 템플릿에 대한 기본적인
개념을 이해 할수 있게 되었고, 그 다음으로 읽었던 Modern C++ Design을 보고
템플릿이라는 문법에 대해 새로운 시각을 갖게 되었습니다.
그 이유인즉
"이걸 이용해서 이렇게 신기하고 범용적인 코드를 구현해 낼수 있구나."
라는 부분 이었습니다.
그렇다면 제가 느낀 부분을 설명드리겠습니다.
첫번째로 범용적, 일반적이라는 부분에 대해서 제가 생각하는 부분을 말해야 겠네요.
STL이 일반화라는 특징을 가진이유가 템플릿 인자를 매개로 받아 반복자, 컨테이너, 알고리즘
삼총사가 분리되어 있다는 점이라고 말하고 있습니다.
하지만 정말로 그러한 부분이 일반적이고 범용적인 이유일까요?
Effective C++(More포함)을 읽어보신 분들은 정확히 컨테이너에 따라 사용방법이 틀려야
한다는것을 알고 계실꺼라 생각합니다.
(물론 대체적으로 공통적인 동작방식으로 이루어져 있습니다.^^;)
하지만 저는 그 부분보다는 어떠한 자료구조도 인식할수 있다는 점, 즉 특정자료구조나 특정
설계구조에서만 돌아갈 필요가 없다는 부분이 참 마음에 들었습니다.
사실 STL보다 템플릿을 더 미리 알고 STL을 보게 되서인지 그런부분이 더 눈에 들어왔었던것도 있었네요.
두번째로 제가 템플릿은 좋아하는 이유는 Modern Design C++ 1장에서 나오는 바로
"특히 디자인의 제한조건을 사용자에게 넘기는 "스스로의 제한조건"으로 넘기는
것은 템플릿 문법의 큰 장점입니다." 이 내용때문입니다.
혹시 SDK의 변경때문에 라이브러리를 전면적으로 개조해 보신적이 있으신가요?
혹시 남이 만들어 놓은 구조가 마음에 안들거나 현재 프로젝트에 적용할수 없다고 느끼신적은 없으신가요?
혹시 다양한 출력과 다양한 객체들을 서로 연결시켜야 해서 클래스를 여러개 만들어 보신적이 있으신가요?
템플릿은 이러한 모든것을 뛰어넘을수 있는 구조를 지원해 준다고 생각합니다.
SDK변경부분은 SDK에 종속적인 부분을 따로 띄어놓은 상태에서 언제든지 템플릿으로 변경 가능하도록 설계시
SDK버전뿐 아니라 SDK가 바뀌는 경우에도 그것을 이겨낼수 있습니다.
물론 크로스컴파일이나 #ifdef등으로 넣는 방법이 있긴 하지만 크로스 컴파일에서 낭비되는 속도와
#ifdef로 인해 코드가 복잡하다고 느껴보신적은 없으신가요?
남이 만든 코드를 접목시키려 할때 구조를 바로 사용할수 없어서 고쳐사용하는 경우가 있는데
근본적인 부분과 연결되어 있을시에는 곤란하지시 않으셨었나요?
이렇게 변경될수 있는 부분에 틈을 벌려놓을수 있다는 점이 템플릿 문법의 강점이라고 생각합니다.
또한 템플릿을 이용한 상속, 포함관계시 언제든 교체가능한 구조로 만들게 될시 그 단위단위의 템플릿은
어떠한 곳에서도 사용가능한 단위클래스가 됩니다. 항상 소프트웨어의 공학에서 강조하고 있는
코드의 재사용성을 정확히 부합시키는 코드를 많이 만들수 있게 된다는 것이지요.
제가 템플릿을 좋아하는건 위에 적어놓은 저부분이 전부입니다.
제가 적어놓은 부분이 정말로 강점으로 보이실지 아니면 단순한 말장난이나
쓸모없는 곳에 열올리는 이상한 사람으로 보일지 모르겠지만 강점으로 볼수 있도록
잘 설명이 되었기를 바랍니다.