문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 템플릿 (문단 편집) === 일반화 프로그래밍 === [[https://en.wikipedia.org/wiki/Generic_programming|일반화 프로그래밍(Generic Programming)]]은 알고리즘이 후에 사용자가 명시할 형에 따라 생성되도록 하는 컴퓨터 프로그래밍의 한 방식이다. [[C++#s-4]]에서는 오래전부터 템플릿이라고 하는 문법을 통해 컴파일 시간에 제공하고 있고, [[Java]]나 [[C\#]] 등 많은 객체지향 언어에서도 이를 제한적으로 채용해서 사용하고 있다. 함수나 클래스의 구현 코드 맨 위에 template 또는 template라고 정의한 후, 함수나 클래스를 사용할 때 자료형을 지정하면 T를 자료형으로 사용한 부분은 모두 해당 자료형으로 치환된다. 여기서 템플릿 문법에 typename이 붙은 T는 정의되지 않은 자료형 이라는 의미로 템플릿 매개변수이이다. 그리고 나중에 int, float 같이 이 자리에 전달되는 자료형의 정보를 템플릿 인자라고 한다.[* 물론 T 말고 다른 문자도 상관 없다.] 간단한 예시로 만일 두 값의 합을 반환하는 Add 함수를 다양한 자료형에 대응시켜야 한다면 단순히 원하는 자료형 갯수만큼 함수 오버로딩을 통해 구현할 수 있지만, 템플릿을 사용하는 경우 하나의 Add 함수에 변수에 따라 달라지는 부분을 템플릿 매개변수로 선언 후 나중에 실질적으로 함수를 부를 때 자료형을 지정해서 간단히 끝낼 수 있다.[* 사실 템플릿 함수를 부르는 과정에서 자료형이 명확하다면 명시를 안해도 컴파일러가 자동으로 알맞는 자료형으로 만들어준다. 템플릿 클래스의 경우는 C++14까지는 형을 명시적으로 지정해줘야 하지만, C++17부터는 생성자에서 형 추론이 가능해졌다. 즉, std::vector a{10, 20, 30}; 이런 식으로 오버로드된 std::initializer_list 생성자 호출이 가능해졌다.] 컴파일러는 이렇게 '''T''' 같은 템플릿 매개변수로 정의되어 있는 부분을 실질적인 자료형을 채워넣어 코드를 완성한다. 다만 앞에서 정수 또는 실수의 숫자를 더하는 Add 함수와는 달리 두 문자를 입력받고 문자를 이어주는 Add 함수가 필요하다면, 그 기능이나 구현이 앞의 숫자만를 사용하는 함수와는 차이가 있음으로. 이 때는 특정 자료형에 따라 사용자가 미리 작업을 지정해주는 특수화 과정을 추가로 정의해주어야 한다. 한가지 주의점은 템플릿으로 선언한 클래스는 나중에 실질적인 사용시 특정 자료형으로 템플릿 인자를 채워넣는 방식으로 동작하므로, 컴파일러가 해당 템플릿 클래스의 모든 부분을 알고 있어야 한다. 때문에 클래스의 선언과 실질적인 구현이 헤더와 다른 소스 파일로 분산되어 있다면 컴파일 오류가 발생한다. 해결법은 이렇다. * 클래스의 선언과 정의를 하나의 헤더 파일 안에 모두 끝낸다. 이 경우 강제되는 것은 아니지만, 일반적으로 파일의 확장자를 .hpp로 표기한다. * 해당 클래스를 사용하는 소스의 전처리 부분에 클래스 선언이 들어가 있는 헤더 파일과 실질적인 구현이 들어있는 소스 파일을 모두 포함시킨다. --이러니까 모듈 시스템 만들자고 하지-- * 아직 시범적인 표준인 모듈을 사용하여, 해당 부분을 export하고 사용하는 코드에 import한다. * 소스 코드 파일(.cpp) 를 헤더 파일처럼 마지막에 #include 해놓는다. 이러한 경우의 소스 코드 파일은 보통 .tpp[* t는 template.] 확장자로 지정한다. [[매크로#s-2.1|매크로]]처럼 컴파일 단계에서 템플릿 인자를 자료형으로 채워넣는 방식이므로 자료형이 많아지면 컴파일이 느려지고 디버그가 어려워진다. 특히 헤더 파일에 템플릿 라이브러리가 들어가는 경우 헤더 파일을 하나 공유하면서 여러 파일이 각각 템플릿 코드를 생성하기 때문에 실질적으로는 엄청난 길이의 코드를 컴파일하게 되는 것. 이를 방지하기 위해서는 별도 객체로 패킹하여 공유되는 헤더파일에는 필요한 자료형만 반환하도록 하면 된다. 특히 구문 분석 기능이 복잡하기 때문에, 템플릿 남용은 에러가 났는데 당최 뭐가 문젠지 알 수 없을 정도로 복잡한 경고가 발생하거나, 자료형을 찾기도 힘들거나[* 심하면 IDE의 디버그 창 한 페이지 전부를 집어먹는 에러 메시지가 고작 하나의 오류를 뜻하는 경우도 생긴다.], 컴파일 된 실행 파일이 너무 커서 실행 시간이 오히려 떨어지거나[* 보통 명령어 캐시(instruction cache) 용량 초과 때문이다.], 용량이 무지막지하게 증가하거나, 컴파일 시간이 하루 종일 걸리는 등의 문제가 생길 수 있으므로 주의해야 한다. 템플릿을 제대로 지원해주는 환경에서 작업하려면 C++14, 최소 C++11을 지원해줘야 한다. C++11과 14의 템플릿 코드는 단축 코드[* C++14가 동일한 코드를 더 짧게 쓸 수 있다.] 가 가능한가, constexpr의 지원, 최적화 등의 이슈로 인해 상당히 차이가 큰 편이다.[* 물론 표준 라이브러리에서 지원해주는 부분은 이전 버전에서 해당 코드만 가져와서 사용할 수도 있다.] C++20부터는 아애 탬플릿 매개변수에 명시적인 조건을 추가할 수 있는 컨셉트가 추가될 예정이어서 C++의 버전 별 차이가 더더욱 커질 것이다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기