태그 : Template

왜 템플릿을 좋아하냐구요??

전 개인적으로 템플릿을 좋아합니다.
템플릿과 비템플릿 기법을 두고 했을때는 왠만하면 템플릿을
사용하는걸 추구하는 편입니다.

그러다 보니 자주 듣는말이 "그 보기 힘든걸 왜 좋아하냐?",
"템플릿은 남발하면 안된다." 라는 말이 대부분이더군요.

우선 간단한 이유인 "템플릿은 남발하면 안된다"라는 거에 대한 대답은
남발해야지 많은곳에 해볼수 있기 때문입니다.
그냥 새로운걸 해보자는 시도지요. 그리고 개인적으로 공부하다보니
남에 눈치를 안봐도 되는 경향도 있지요.
그리고 가장 중요한 이유는 아래 좋아하는 이유에 대한 설명을 보시면
이해가 되실것으로 예상됩니다.

그럼 다음 질문인 "그 보기 힘든걸 왜 좋아하냐?"라는 질문입니다.
저도 템플릿은 처음 본건 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로 인해 코드가 복잡하다고 느껴보신적은 없으신가요?

남이 만든 코드를 접목시키려 할때 구조를 바로 사용할수 없어서 고쳐사용하는 경우가 있는데
근본적인 부분과 연결되어 있을시에는 곤란하지시 않으셨었나요?

이렇게 변경될수 있는 부분에 틈을 벌려놓을수 있다는 점이 템플릿 문법의 강점이라고 생각합니다.

또한 템플릿을 이용한 상속, 포함관계시 언제든 교체가능한 구조로 만들게 될시 그 단위단위의 템플릿은
어떠한 곳에서도 사용가능한 단위클래스가 됩니다. 항상 소프트웨어의 공학에서 강조하고 있는
코드의 재사용성을 정확히 부합시키는 코드를 많이 만들수 있게 된다는 것이지요.

제가 템플릿을 좋아하는건 위에 적어놓은 저부분이 전부입니다.
제가 적어놓은 부분이 정말로 강점으로 보이실지 아니면 단순한 말장난이나
쓸모없는 곳에 열올리는 이상한 사람으로 보일지 모르겠지만 강점으로 볼수 있도록
잘 설명이 되었기를 바랍니다.

by JetLi | 2008/09/20 00:24 | C++ Template | 트랙백 | 덧글(0)

Modern C++ Design(study)

(이번에 Modern C++ Design을 공부할일이 있어서 이곳에 같은 내용을 적게 됬습니다.
틀린내용이 있을수 있으니 가려서 보시기 바랍니다.)

소프트웨어 디자인을 제작중에 다양한 기능의 클래스를 제작할때 복잡해지는 문제와
코드의 재사용을 위해서는 단위전략 기반의 클래스 디자인이 좋고,
이러한 디자인은 템플릿 문법과 다중상속을 이용하면 서로의 단점을
보강하여 훌륭한 해결법이 될수 있습니다.
특히 디자인의 제한조건을 사용자에게 넘기는 "스스로의 제한조건"으로 넘기는
것은 템플릿 문법의 큰 장점입니다.

단위전략은 특정단위에 대한 작업을 특정클래스에 위임하는것인데 이러한
클래스를 단위전략 클래스라하며, 아마도 stl::map에서 마지막 템플릿 인자인
정렬용 함수객체가 이러한 단위전략클래스의 한 부류라 생각됩니다.

템플릿 인자로 단위전략을 할시에는 좋은점으로서는
1. 사용자가 원하는 모습으로 특정기능을 만들어 낼수 있다.
2. 템플릿 인자를 받아들이는 클래스는 하나의 틀로서 사용될수 있다.
3. 단위전략 클래스는 다른곳에서도 사용가능하다.
4. 사용자가 단위전략을 바꾸었을시 컴파일상에서 에러를 넘겨주므로 사용방법이
틀리더라도 어디에서 사용되고 있는지 알아내기 쉽다.
라는 장점을 가질수 있고
기존에 잘 만들어진 부분에는 특화템플릿 문법으로 처리하여 피해갈수 있습니다.

책에서 소개하는 단위전략클래스는 상속과 함깨 사용되는 부분에 대한 설명이라서
소멸자에 대한 문제가 나오는데 protected로 처리하여 외부에서 해제할수 없도록
막고 있으며, 단위전략 클래스를 받는 클래스에서 처리하도록 하고 있습니다.

단위전략 클래스를 조합하는 템플릿 클래스를 만들시 기존에 일일히 손으로
상속시켜 만든것을 컴파일러를 이용하여 코드생성을 할수 있는데, 이러한
부분을 단위전략 기반의 클래스 디자인의 또하나의 큰 장점으로 꼽고 있습니다.

단위전략 템플릿 클래스는 컴파일러 입장에서는 전혀 다른 클래스이므로
변환연산자를 지정하지 않는 이상 되지 않는다는 점을 상기시키고 있습니다.

마지막으로 클래스를 단위전략 클래스로 분류할때는 단위전략 클래스끼리
공통되는 부분이 없이 독립적인 단위전략 클래스를 구성할 것을 권고 하고 있습니다.

결론적으로 템플릿을 이용한 단위전략 클래스는 단위전략 컴포넌트의 조합으로
원하는 클래스를 생성해 낼수 있고 이러한 부분은 차후 재사용성등에도
사용가능하며, 확장성에도 좋으며, 기존에 가상클래스를 기반으로
설계한 구성보다 단위전략이 바뀌었을때 컴파일 에러를 통하여
알수 있으므로 좋으며, 마지막으로 디자인의 제한조건을 사용자에게 넘길수 있으므로
사용자가 사용하기에 편하다는 장점이 있습니다.

by JetLi | 2008/05/04 22:15 | C++ Template | 트랙백 | 덧글(0)

◀ 이전 페이지 다음 페이지 ▶