Q.템플릿
Q.템플릿
Q. 템플릿?
답변 보기
자료형이나 값을 일반화하여 코드 재사용성을 높이기 위한 기능입니다.컴파일 시점에 실제 타입이 결정되며, 같은 로직을 여러 타입에 대해 안전하게 사용할 수 있도록 합니다.
템플릿의 장점은
1. 타입 안정성을 유지하면서
2. 중복 코드를 제거하고
3. 컴파일 타임 다형성을 제공한다는 점입니다.
단점은
1. 컴파일 에러 메시지가 길고 복잡해질 수 있고
2. 템플릿 인스턴스화로 인해 컴파일 시간이 증가할 수 있다는 점이 있습니다.
-> 코드 비대화
수학 연산, 컨테이너 래퍼, 공용 유틸 함수 등을 템플릿으로 구현해 성능 손실 없이 재사용 가능한 구조를 만드는데 활용할 수 있습니다.
(기능은 결정되어 있지만 자료형은 결정되어 있지 않은 문법입니다. 즉, 타입에 의존하지 않은 함수나 클래스를 작성할 수 있게 해줍니다.)
Q. 템플릿과 상속 기반 다형성의 차이는?
답변 보기
템플릿은 컴파일 타임 다형성으로 성능 오버헤드가 없고,상속은 런타임 다형성으로 유연하지만 가상 함수 호출 비용이 발생합니다.
Q. 템플릿은 언제 쓰고, 상속은 언제 쓰나요?
답변 보기
타입이 컴파일 시점에 명확하고 성능이 중요한 경우에 템플릿을 사용하고,런타임에 객체 교체가 필요하고 인터페이스 중심 설계가 필요한 경우 상속을 사용합니다.
(게임 엔진 코어 로직:템플릿 / 게임 로직 계층:상속)
Q. 템플릿 특수화?
답변 보기
특정 타입에 대해 다른 구현을 제공하는 기법으로,일반 템플릿은 유지하면서 예외적인 동작을 정의할 수 있습니다.
Q. 코드 비대화가 왜 생기나요?
답변 보기
템플릿은 타입마다 별도의 코드가 컴파일 시점에 인스턴스화 되기 때문에, 여러 타입에 대해 동일한 템플릿을 사용하면 그만큼 실행 코드가 증가할 수 있습니다.특히 복잡한 클래스 템플릿이나 대형 함수 템플릿을 여러 타입으로 반복 사용하면 바이너리 크기가 커질 가능성이 있습니다.
템플릿은 타입마다 코드가 복사 생성되기 때문입니다.
vector<int>, vector<float>, vector<MyClass>는 모두 다른 코드입니다. 이를 완화하기 위해
- 공통 로직은 비템플릿 함수로 분리하고
- 인터페이스가 필요한 부분만 템플릿으로 유지하거나
- 필요하지 않은 타입 인스턴스화를 제한하는 방식으로 관리합니다.
Q. 코드 비대화 vs 가상 함수 호출 비용, 어느 쪽이 더 문제?
답변 보기
호출 빈도가 높은 로직에서는 템플릿이 유리,타입 수가 많고 인터페이스 중심 구조에서는 상속이 더 적합합니다.
Q. 코드 비대화가 일어나면 무엇이 안좋은가?
답변 보기
Q. 템플릿 특수화(Template Specialization)가 헤더에 필요한 이유는 무엇인가요?
답변 보기
Q. 템플릿 클래스/함수는 왜 구현을 헤더 파일에 넣어야 하나요?
답변 보기
This post is licensed under CC BY 4.0 by the author.