최근 수정 시각 : 2019-07-21 17:05:50

템플릿

파일:나무위키+유도.png   나무위키에서 사용되는 템플릿 목록에 대한 내용은 분류:템플릿 문서를 참조하십시오.
1. 일반적 의미2. 나무위키에서의 템플릿3. 일본어 속어로서의 템플릿
3.1. 일반적인 의미3.2. 비디오 게임에서
4. 도형자5. 미니어처 게임의 게임용 도구6. C++에서의 템플릿
6.1. 일반화 프로그래밍6.2. 템플릿 메타 프로그래밍
7. 문서 작성상에서의 템플릿

1. 일반적 의미

Template. 형판, 형틀 어떤 특정한 모양을 만들기 위해 만들어진 틀을 말한다. 예를 들어 빵이나 주먹밥 같은 것의 모양을 내기 위해 찍거나 채워넣도록 만든 틀도 일종의 템플릿이다. 4번 항목의 모형자 역시 이러한 원래 의미의 템플릿이다. 여기서 파생된 의미로 특정한 서식 구조를 만들어 놓은 양식이란 의미도 있다.

예를 들어 애프터 이펙트 등의 동영상 프로그램이나 파워포인트 등의 문서 작업에 사용되도록 미리 예쁘장하거나 전문적인 모양으로 틀을 만들어놓은 것이 바로 템플릿. 해당 프로그램을 조금만 다룰 줄 알면 이 템플릿을 이용하여 이미지나 글만 조금 넣어서 일정 수준 이상의 완성도를 내기 위해 필요한 노력과 시간을 줄일 수 있다.

2. 나무위키에서의 템플릿

보통 위키위키에서 사용할 때는 '틀'이라고 번역되지만 나무위키에선 템플릿이라는 어휘를 그대로 쓴다. 왜냐하면 틀이라고 하면 문서나 절의 상단에 넣기 위한 상자 틀과 의미가 겹치기 때문이다.

나무위키에서 템플릿은 특정 분야의 문서들 간에 통일성을 주기 위해 기본적인 편집 양식을 마련해놓은 템플릿 문서를 의미한다. 특정 분야의 템플릿 문서가 만들어지면 해당 분야의 문서들을 템플릿에 맞춰 수정하거나, 새 문서를 생성할 때 템플릿 문서를 통째로 복사·붙여넣기한 후 수정해 새 문서를 만드는 식으로 쓰인다. 템플릿 생성법과 사용법에 대한 자세한 설명은 분류:템플릿 문서를 참고.

미디어위키 같은 위키 엔진의 템플릿 기능과 달리 나무위키의 템플릿은 현재로썬 단순히 특정 레이아웃을 구성해놓고 복붙하려고 쓰는 일종의 양식 역할에 불과하다. 즉, 연동 기능을 지원하지 않기 때문에[1] 템플릿의 양식 자체가 변경될 경우 해당 템플릿의 변경 이전 양식을 사용한 문서의 내용을 일일이 수작업으로 바꿔줘야 하는 불편함이 따른다. 추후 개선이 필요한 부분.

템플릿은 문서 간 통일성을 위해 만들어지지만 일부 템플릿을 제외하면 템플릿을 반드시 따를 필요는 없다. 템플릿 문서 자체가 기본적으로 자유로운 생성과 수정이 가능하고 따라서 어떠한 권위도 없기 때문이다. 이 경우 템플릿을 따르는 편집자와 무시하는 편집자 간의 편집 분쟁이 벌어질 수 있고, 이를 방지하자면 템플릿에 강제력을 부여하는 규정을 편집지침에 신설해야 한다. 규정상의 권위를 부여받은 템플릿은 이전처럼 자유로운 수정은 불가능해지지만[2] 함부로 템플릿을 무시하는 편집 역시 불가능하게 함으로써 특정 분야의 문서들을 확실하게 통일된 양식으로 구성하는 걸 가능하도록 만든다.

3. 일본어 속어로서의 템플릿

3.1. 일반적인 의미

テンプレ(텐프레)

비슷하거나 동일한 행위 따위를 뜻하는 단어이다. 어원은 불분명하지만 2ch로 추정된다. 2ch에는 스레드당 레스 1000건 제한이 있어 같은 내용을 다루는 스레의 part 2 이후의 스레드 첫머리는 항상 동일한 내용으로 채워지게 되고, 그 부분을 텐프레라 부르는데, 그러다가 단순 코피페(복붙) 글을 텐프레라 부르게 되었을 가능성이 높다. 니코니코 동화에서는 같거나 비슷한 장면에 동일한 코멘트를 남기는 행위를 뜻하며, 악마성 TAS 등에서 코멘트 탄막을 덧붙이고 마지막에 여기까지 텐프레(テンプレ)였다고 코멘트 하던게 다른 비슷한 영상에도 적용되기도 한다.

이후 내용이 확장되어 서브컬쳐 작품에서 캐릭터나 스토리 흐름등이 '일반적인 경우 ~~라면 떠오르는 형태'라는 의미로도 쓰인다. '텐프레 전개' '텐프레 주인공' '텐프레 히로인' 등등.

나아가서 발음의 유사성 탓인지 天婦羅・天麩羅(덴뿌라...)라고 표기하는 경우도 있다. 텐프레만 재탕하는 경우를 가리켜 튀김덮밥[3]이라고 표현하는 경우도 있지만, 애초에 이 텐동(天丼)이란 말은 주로 일본 만담업계 쪽에서 재탕을 의미하는 단어로 더 자주 쓰이는지라 다소 마이너한 표현.

3.2. 비디오 게임에서

몬스터 헌터 시리즈 따위에서 무기에 맞는 최대 효율을 낼 수 있거나 입수/제작 난이도 대비 성능이 좋은 장비 구성을 이르는 말이다. '교복'이나 '국민 세팅'과는 상대하는 인스턴스에 맞춰서 스킬을 변형할 수 있도록 구멍을 메워놓는다는 미묘한 차이점이 있는 경우도 있지만, 보통은 동의어이다. 몬스터 헌터 시리즈의 예로는 쿠샬태도......가 아니라몬스터 헌터: 월드제노라지 3셋 기반의 헤비보우건 세팅이나 용기사 4셋 혹은 카이저 3셋 기반의 극딜+예리도 세팅이 있다.

4. 도형자

자주 쓰이는 도형을 쉽게 그릴 수 있게 도형 모양으로 구멍을 뚫어 놓은 자.

예를 들면 아래의 컴퓨터 도형자는 순서도에 사용되는 기호를 그리는데 특화되어 있다.

파일:attachment/ibm-flowchart-template.jpg

5. 미니어처 게임의 게임용 도구


Warhammer 40,000의 템플릿.

'템플릿'이라는 말처럼 여러 가지 모양을 한 얇고 평평한 플라스틱 판. 사실 규격만 맞는다면 재질은 종이가 되었든[4] 금속제든 간에 상관 없지만, 일반적으로 게임 회사에서 공식적으로 파는건 보통 투명한 플라스틱 판이다. 이는 템플릿이 광역 공격 등에 주로 사용되므로, 적이 공격에 얼마나 얻어맞는가를 보는 데에는 투명한 재질이 게임 플레이에 보다 유리하기 때문.

Warhammer 40,000에서는 폭발 공격이나 화염방사기 등의 광역 공격을 할 때 템플릿을 사용한다. 이러한 광역 공격 무기는 무기의 사정거리에 '템플릿(Template)'이라 씌여있거나 혹은 무기 옵션에 '블라스트(Blast)'가 들어 있으며, 전자의 경우 길다란 물방울 모양의 것을, 후자는 동그란 것을 사용한다.

'템플릿'으로 판정하는 무기들은 화염방사기 계열의 무기들로, 공격 선언 후 템플릿의 좁은 부분을 공격자의 무기 총구에, 넓은 부분을 적으로 향하게 배치한 후 명중 판정을 하지 않고 템플릿에 겹쳐있는 모든 적에게 자동으로 명중한 것으로 간주한다.그러니까 리그 오브 레전드의 스킬 범위 표시를 생각하면 쉽다

블라스트 무기는 착탄점을 기준으로 반경 3인치(일반 블라스트) 혹은 5인치(라지 블라스트) 내에 범위로 데미지를 주는 무기인데, 특이하게도 블라스트 무기는 추가로 스캐터 다이스[5]를 이용해서 무기가 얼마나 빗나갔는지를 판정해야 한다. 이 경우 무기가 원하는 대상에 명중할 확률은 모델의 BS에 상관없이 3분의 1이며, 나머지의 경우 스캐터 다이스에서 나온 화살표 방향에 아틸러리 다이스[6]를 추가로 굴려 주사위에 나온 수만큼 블라스트 템플릿을 이동시킨 후 데미지 판정을 한다. 이 경우 BS 수치만큼 빗나간 거리를 보정할 수 있다.[7][8]

특이하게 새비지 월드의 경우에는 TRPG이면서도 미니어처 게임의 게임성을 바탕으로 하기 때문에 TRPG임에도 불구하고 템플릿을 사용한다.[9] 현대 중화기나 이능이 난무할 경우 중형 폭발 범위나 대형 폭발 범위가 턴마다 깔리고 PC건 NPC건 바람 앞의 등불처럼 훅훅 꺼져버리는 장관을 볼 수 있다.

6. C++에서의 템플릿

C++에서 템플릿은 일반화 프로그래밍(Generic Programming)과 템플릿 메타 프로그래밍(Template Meta-Programming)이라는 두 가지 용도로 사용된다. 보통 C++ 템플릿 프로그래밍이라고 하면 전자인 일반화 프로그래밍을 지칭하는 것이다.

6.1. 일반화 프로그래밍

일반화 프로그래밍(Generic Programming)은 알고리즘이 후에 사용자가 명시할 형에 따라 생성되도록 하는 컴퓨터 프로그래밍의 한 방식이다. C++에서는 오래전부터 템플릿이라고 하는 문법을 통해 컴파일 시간에 제공하고 있고, JavaC# 등 많은 객체지향 언어에서도 이를 제한적으로 채용해서 사용하고 있다.

함수나 클래스의 구현 코드 맨 위에 template<typename T> 또는 template<class T>라고 정의한 후, 함수나 클래스를 사용할 때 자료형을 지정하면 T를 자료형으로 사용한 부분은 모두 해당 자료형으로 치환된다.
여기서 템플릿 문법에 typename이 붙은 T는 정의되지 않은 자료형 이라는 의미로 템플릿 매개변수이이다. 그리고 나중에 int, float 같이 이 자리에 전달되는 자료형의 정보를 템플릿 인자라고 한다.[10]

간단한 예시로 만일 두 값의 합을 반환하는 Add 함수를 다양한 자료형에 대응시켜야 한다면 단순히 원하는 자료형 갯수만큼 함수 오버로딩을 통해 구현할 수 있지만, 템플릿을 사용하는 경우 하나의 Add 함수에 변수에 따라 달라지는 부분을 템플릿 매개변수로 선언 후 나중에 실질적으로 함수를 부를 때 자료형을 지정해서 간단히 끝낼 수 있다.[11] 컴파일러는 이렇게 T 같은 템플릿 매개변수로 정의되어 있는 부분을 실질적인 자료형을 채워넣어 코드를 완성한다.

다만 앞에서 정수 또는 실수의 숫자를 더하는 Add 함수와는 달리 두 문자를 입력받고 문자를 이어주는 Add 함수가 필요하다면, 그 기능이나 구현이 앞의 숫자만를 사용하는 함수와는 차이가 있음으로. 이 때는 특정 자료형에 따라 사용자가 미리 작업을 지정해주는 특수화 과정을 추가로 정의해주어야 한다.

한가지 주의점은 템플릿으로 선언한 클래스는 나중에 실질적인 사용시 특정 자료형으로 템플릿 인자를 채워넣는 방식으로 동작하므로, 컴파일러가 해당 템플릿 클래스의 모든 부분을 알고 있어야 한다. 때문에 클래스의 선언과 실질적인 구현이 헤더와 다른 소스 파일로 분산되어 있다면 컴파일 오류가 발생한다. 해결법은 이렇다.
  • 클래스의 선언과 정의를 하나의 헤더 파일 안에 모두 끝낸다.
  • 해당 클래스를 사용하는 소스의 전처리 부분에 클래스 선언이 들어가 있는 헤더 파일과 실질적인 구현이 들어있는 소스 파일을 모두 포함시킨다.
    이러니까 모듈 시스템 만들자고 하지
  • 아직 시범적인 표준인 모듈을 사용하여, 해당 부분을 export하고 사용하는 코드에 import한다.
  • 소스 코드 파일(.cpp) 를 헤더 파일처럼 마지막에 #include 해놓는다. 이러한 경우의 소스 코드 파일은 보통 .tpp[12] 확장자로 지정한다.

컴파일 단계에서 템플릿 인자를 자료형으로 채워넣는 방식이므로 자료형이 많아지면 컴파일이 느려지고 디버그가 어려워진다.

특히 구문 분석 기능이 복잡하기 때문에, 템플릿 남용은 에러가 났는데 당최 뭐가 문젠지 알 수 없을 정도로 복잡한 경고가 발생하거나, 자료형을 찾기도 힘들거나[13], 컴파일 된 실행 파일이 너무 커서 실행 시간이 오히려 떨어지거나[14], 용량이 무지막지하게 증가하거나, 컴파일 시간이 하루 종일 걸리는 등의 문제가 생길 수 있으므로 주의해야 한다.

템플릿을 제대로 지원해주는 환경에서 작업하려면 C++14, 최소 C++11을 지원해줘야 한다. C++11과 14의 템플릿 코드는 단축 코드[15] 가 가능한가, constexpr의 지원, 최적화 등의 이슈로 인해 상당히 차이가 큰 편이다. [16]
C++20부터는 아애 탬플릿 매개변수에 명시적인 조건을 추가할 수 있는 컨셉트가 추가될 예정이어서 C++의 버전 별 차이가 더더욱 커질 것이다.

6.2. 템플릿 메타 프로그래밍

C++의 템플릿 문법을 활용해 컴파일 시간에 상수나 데이터 구조체, 함수가 결정되도록 하는 메타 프로그래밍 기술의 일종이다. 이를 구현하는 언어는 C++가 대표적이고 D언어 등의 극소수의 언어가 지원하고 있다. 자세한 내용은 해당 문단을 참고.

7. 문서 작성상에서의 템플릿

미리 짜놓은 틀과 같은 파일을 말한다. 워드 템플릿, 피피티 템플릿, 엑셀 템플릿 등.


[1] 이는 틀:관련 문서처럼 변수 입력을 지원하는 틀의 그것과 같다.[2] 이용자들끼리 따르기로 합의한 템플릿은 당연히 규정 토론 당시의 템플릿일 뿐, 누가 임의로 수정한 템플릿을 따를 이유는 없기 때문이다. 규정상 강제력이 있는 템플릿을 수정하려면 수정할 때마다 매번 새로 토론을 열어 합의를 구해야 한다.[3] 天ぷら丼(텐푸라동). 보통 줄여서 텐동(天丼)이라고 한다.[4] 가령 Warhammer 40,000 룰북에는 템플릿 모양이 나와있는 페이지가 있어서, 이걸 복사해서 잘라 쓸 수 있도록 되어있다.[5] 2개의 명중 표시와 4개의 화살표 표시가 있는 주사위.[6] 2, 4, 6, 8, 10, 12의 숫자가 표시된 주사위. 이건 그냥 일반 주사위를 하나 굴린 후 2배를 해도 된다.[7] 가령 BS4짜리 모델이 스캐터 판정이 나온 후 아틸러리 다이스에서 8이 나왔다고 하자. 그러면 이 공격의 경우 아틸러리 다이스의 수 8에서 BS 수치 4를 뺀 4값만큼만 블라스트 템플릿을 이동시켜 판정한다. BS 수치가 아틸러리 다이스의 눈수보다 높을 경우 빗나감 판정을 무시할 수 있다.[8] 다만 전혀 명중할 수가 없는 상황에서 명중 판정이 난 경우 명중 주사위 면에 있는 작은 화살표 방향으로 템플릿을 이동시킨다.[9] 미니어처가 없어도 할 수 있지만 그래도 보통 새비지 월드를 플레이하는 팀은 거리 계산을 엄격하게 한다.[10] 물론 T 말고 다른 문자도 상관 없다.[11] 사실 템플릿 함수를 부르는 과정에서 자료형이 명확하다면 명시를 안해도 컴파일러가 자동으로 알맞는 자료형으로 만들어준다. 템플릿 클래스의 경우는 C++14까지는 형을 명시적으로 지정해줘야 하지만, C++17부터는 생성자에서 형 추론이 가능해졌다. 즉, std::vector a{10, 20, 30}; 이런 식으로 오버로드된 std::initializer_list 생성자 호출이 가능해졌다.[12] t는 template.[13] 심하면 IDE의 디버그 창 한 페이지 전부를 집어먹는 에러 메시지가 고작 하나의 오류를 뜻하는 경우도 생긴다.[14] 보통 명령어 캐시(instruction cache) 용량 초과 때문이다.[15] C++14가 동일한 코드를 더 짧게 쓸 수 있다.[16] 물론 표준 라이브러리에서 지원해주는 부분은 이전 버전에서 해당 코드만 가져와서 사용할 수도 있다.