본문 바로가기

C++

C++ 면접 질문) "C++ 템플릿이 뭔가요? 관련해서 사용한 경험 있으시면 말씀해주세요."

C++ 템플릿의 배경:

  • C++ 는 statically typed language 이다
    • compile 시점에 type 이 확정되어야 한다
    • 같은 동작을 하는 함수더라도 type 별로 함수를 코딩해야 했다
    • Python 은 dynamically typed language 이다
  • C++ 는 runtime overhead 를 최저로 줄였다
    • Python 은 runtime 시점에 type 을 결정해야 하기 때문에 overhead 가 생긴다

C++ 템플릿의 용도:

  • 틀을 만든다
    • 같은 동작을 하고, type 만 달라지는 경우에 재사용이 가능한 틀을 만든다
  • 필요한 것만 만든다
    •  실제 type이 결정되고 생성이 필요한 함수만 만든다

C++ 템플릿과 객체지향:

  • 객체지향의 다형성의 의미와 템플릿의 다형성 의미는 다르다:
    • 객체지향의 다형성 (동적): runtime 시점에 동적으로 implementation 결정
      • 가상 함수 (virtual function) 와 override 함수 와 좀 더 관련됨
    • 템플릿의 다형성 (정적): compile 시점에 정적으로 type 결정
  • 템플릿을 쓰면 성능 면에서 더 우위하다
    • 런타임 시에 동적으로 해야 할 일을 컴파일 시에 정적으로 한다

C++ 템플릿 종류:

  • 함수 템플릿:
template <class Type>
Type add(Type a, Type b) {
  return a + b;
}

add<int>(10,20); // 이 시점 템플릿이 인스턴스화 됨
  • 변수 템플릿:
template <class Type>
constexpr Type pi = Type(3.14159265359)
  • 클래스 템플릿: 예시) std::vector
template <class Type>
class Pair {  
public:
  Pair(Type f, Type s) : first(f), second(s) {}
private:
  Type first, second;
}

Pair<float> pair(0.5, 1.0);
  • Variadic 템플릿:
// recursive
template <class Type, class... Args>
Type sum(Type n, Args... args) {
  return n + sum(args...);  
}

// base case for recursive
template <class Type>
Type sum(Type n) {
  return n;
}

// type inferred
sum(1,2,3,4,5);
// 1 + sum(2,3,4,5)
// 1 + 2 + sum(2,3,4,5);
// ...

 

C++ 템플릿 사용 경험:

  • Message Relay Service: A가 C를 통해 B를 호출 할 때, C가 B를 호출 할 때 A로부터 받은 가변 인자를 사용하기 위해서 (Perfect Forwarding)
    • 예시: service framework
      • 등록된 service의 API를 호출 시 해당 API가 어떤 인자를 받을지 모르니, variadic template을 사용해 caller 쪽에서 보낸 다양한 인자에 대응

다음 글:
- C++ 면접 질문) "Virtual Function이 뭔가요? 관련해서 사용한 경험 있으시면 말씀해주세요."

- C++ 면접 질문) "Perfect Forwarding이 뭔가요? 관련해서 사용한 경험 있으시면 말씀해주세요."