template 그것은 과연 무엇일까?

nayana의 이미지

요새 template 부분을 공부해서 현재 작업 하는것에 많이 적용하고 있습니다. 일단 template을 쓰는 이유는 현재 상속 관계가
많이 포함되어 있어서...template을 쓰고 있습니다. 인터넷 한문서를 찾아서 읽어본 기억이 있는데...상속 관계에서 run time에
실행 되지만 template을 쓰게 되면 compile time에 결정되서 퍼포먼스를 올릴수 있다는 내용을 읽어 보았습니다. 또한 가상함수에서 inline을 쓸수 있다는 점 입니다. 그래서 나름대로 template으로수정해서 작업하고 있는데...저의 팀장님이 이런 말씀을 하더군요..template은 define확장 이라서 함부로 쓰면 위험하다고 하더군요..그래서 c++문법책을 뒤져 보았는데...template 부분에 define이라는 부분과 연관되는 없더군요...그래서 왜 template이
define의 확장자라는 생각이 지금도 이해가 안됩니다. 제 나름대로
template 부분이 좋은점이 많아서...template에 쓰는거에 버릇을들여서 쓰고 있는데...팀장이 쓰지 말라고 하니까....신경이 쓰입니다. template부분에 대한 논쟁도 벌였구요!!
마지막으로 내린결론은 제대로 알고 쓰라고 하다군요..!! 제대로 알기전까지는 쓰지 말라고!!! 그래서 일단은 template이 define의 확장자인지 부터 조사 해보아야 겠습니다.
아시는 분은 답변좀 주세요....그리고 그 이외의 내용도 좋습니다.

ixevexi의 이미지

음...............

The C++ Standard Library : A Tutorial and Reference와
modern c++ design을 읽어보세요

제 짧은 생각으로는

C++이 가지고 있는 능력중에
'최신' OOP언어들을 누를 수 있는 feature가 바로 템플릿입니다.

솔직히 C++의 꽃이죠 ㅠ.ㅜ

PS. 이렇게 말하는 저도 사실 잘 모릅니다.
그저 취미로 좋아해서 하는 학생이니까요
그저 아 정말 C++의 능력은 아름답기 그지없구나 하고 혼자 뻑간답니다 -_-;;
책 이름 때문에 몇번 수정하였습니다

C++, 그리고 C++....
죽어도 C++

myueho의 이미지

템플릿과 상속관계는 매우 다릅니다
각각 Generic programming, OOP 에 해당하고요.

제 생각으로도 제대로 알고 쓰시는 것이 좋을 것 같습니다.

define 확장이란 말은 처음 듣습니다.
간단히 생각해 컴파일 할때 각 템플릿 인자마다 코드를 생성한다고 생각하면 됩니다.

doldori의 이미지

템플릿에 대해서 좀 오해하시는 것이 있어서 글을 남깁니다.

1. 상속 관계를 템플릿으로 표현하면 도움이 되는가?
제 생각에 OOP로 접근하면 자연스러운 상황에서 generic programming을 쓴다고
해서 도움이 될 것 같지는 않습니다. 둘 다 어떤 공통점(commonality)을 표현하는
방식이기는 하지만 하나가 다른 것으로 치환될 수 있는 성질은 아니거든요. 거칠게
말하면 상속은 데이터의 공통점을, 템플릿은 알고리듬의 공통점을 표현할 때 적당한
방식이 아닐까 합니다.

2. 상속은 런타임에, 템플릿은 컴파일 타임에 바인딩이 결정되는가?
그렇지 않습니다. 가상함수가 없다면 상속을 받아도 컴파일 타임에 결정될 것이고
템플릿 클래스가 가상함수를 갖고 있다면 역시 런타임에 바인딩이 결정될 것입니다.
따라서 템플릿을 쓰면 반드시 성능이 좋아진다고 할 수는 없습니다. 앞에서도 말했듯이
선택 기준은 성능이 아니라 표현하고자 하는 개념에 어떤 것이 어울리느냐 하는 것입니다.

3. 템플릿 클래스에서는 가상함수의 인라이닝이 가능한가?
아닙니다. 템플릿이든 아니든 간에 가상함수의 인라이닝은 논리적으로 불가능합니다.
가상함수의 목적이 어떤 함수를 호출할지 런타임에 결정하겠다는 것이므로 컴파일
타임에 결정되는 인라이닝은 할 수 없습니다.
그리고 템플릿에서 가상함수를 쓴다는 것은 상속관계를 템플릿으로 표현한 것이므로
템플릿에서는 인라이닝이 되고 상속에서는 안된다는 말 자체가 모순입니다.

4. 템플릿은 매크로의 확장인가?
개념상의 확장이라면 그렇다고 할 수 있겠지만, 기능상으로는 확장이라기보다 서로
다른 차원의 특성이라고 하겠습니다. 매크로는 전처리를 통해 소스 코드 자체에
변경을 가함으로써 프로그래머가 생각한 코드와 실제로 컴파일되는 코드 사이에
차이가 생기며, 그 때문에 미묘한 문제가 발생할 수도 있고 매크로 때문에 생긴
에러는 잡기도 어렵지요. (저도 당해봤고 다른 사람이 당하는 걸 보기도 했습니다.)
그래서 C++에서는 매크로를 가능한 한 피하고 그 대신에 const, inline, 템플릿을
쓰는 것이 권장되는 방식입니다. 이들은 매크로의 효율을 살리면서도 C++에서
중요시되는 엄격한 타입 체킹이 그대로 적용되므로 안전하기 때문입니다.

kyagrd의 이미지

직접 쓸 일이 아주 많지는 않지만 템플릿을 이용해 잘 만들어진 라이브러리들은 아주 좋습니다. 일단 표준라브러리의 컨테이너와 알고리즘 관련 부분(소위 STL 이라 불렸던 것들)을 한번 쓰기 시작하면 그것 없이는 답답해서 프로그램 C++로 프로그램할 의욕이 상실될 정도입니다. 그러다 boost 라이브러리에서 괜찮은 것도 써보시고 하면 됩니다.

--
There's nothing so practical as a good theory. - Kurt Lewin
"하스켈로 배우는 프로그래밍" http://pl.pusan.ac.kr/~haskell/

익명 사용자의 이미지

c++의 꽃입니다.

zelon의 이미지

template 에 대해 잘 알고 싶으시면 이 책을 읽어보세요.

http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200303030004

정말 감동 받을 수 있습니다. ^^ template 를 어떻게 써야하는 가에 대해서 정확히 아실 수 있으실 듯... 그리고 template 은 결국 무엇인가에 대한 답도 내실 수 있을 겁니다.

제가 내린 결론은 단어 그대로의 template. 틀입니다. 이 틀을 컴파일러가 어떻게 해석하고, 풀어내는 방법을 아는가, 그리고 어떻게 그것들을 활용하여 '기법' 으로 만들어 내는가가 중요하다고 생각합니다.

-----------------------------------------------------------------------
GPL 오픈소스 윈도우용 이미지 뷰어 ZViewer - http://zviewer.wimy.com
블로그 : http://blog.wimy.com

theuhm의 이미지

Effective C++에 항목41에 다음과 같은 구문이 있습니다.

Quote:

... 양쪽 모두 다른 타입 T를 다루게 된다. 하지만, 여러분 자신에게 물어봐야 하는 질문은 바로 이것이다: T타입이 클래스의 동작 원리(behavior)에 영향을 미치는가? 만약 T가 동작원리에 영향을 미치지 않는다면 여러분은 템플릿을 사용해야 한다. 만약 T가 동작 원리에 영향을 미친다면 여러분은 가상함수가 필요할 것이므로, 상속을 사용해야 한다.

이것이 generic programming과 oop의 차이점입니다. 말 그대로, 상속을 써야할 부분에서는 상속을, 템플릿을 써야할 부분에서는 템플릿을 쓰는 것이 좋다는 거지요 :)

그리고 템플릿이 매크로의 확장인가.. 라는 점에 대해서는, C에서 쓰였던 다음과 같은 종류의 매크로를, 타입 시스템 안으로 끌어들이기 위해서 C++에 추가된 특질이 템플릿이라고 보면 될듯 합니다.

#define max( a, b ) ( (a)>(b)?(a):(b) )

따라서, 역사적인 이유로 보자면, 템플릿은 매크로의 약점을 보완하고 대체하기 위해 도입된 것은 맞습니다. 어떻게 보면 하는 일도 비슷합니다. 매크로가 코드상에 해당 매크로를 삽입하는 것이라면, 템플릿도 스페셜라이즈되면 해당 코드가 생성되어 바인딩되며, (필요하다면) 인라인 확장이 되기도 하므로, 매크로 선언과 비슷한 효과를 가지는 것은 맞죠.
하지만, 템플릿이 매크로의 단순 확장이라는 관점은 좀 부적절한 것 같습니다.

..

kihongss의 이미지

nayana wrote:
또한 가상함수에서 inline을 쓸수 있다는 점 입니다.

분명 가상함수에서 inline 키워드를 적용해도 컴파일 에러는 안나지만, 실제로 inline이 될지는 컴파일러의 능력에 달렸죠.
단순히 객체를 스택에 생성해서 쓸때라면, 가상함수를 쓰더라도 컴파일시에 어떤 멤버함수를 사용할 것인지 결정된 상태라, inline을 적용을 받을수 있겠지만, 힙에 생성한 경로라면 말이 달라지죠.
Efficient C++에 잘 나와있지요,

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.