배고픈 개발자 이야기

Template 이란? (C/C++) 본문

언어/C언어, C++언어

Template 이란? (C/C++)

이융희 2019. 9. 20. 18:29
728x90

template를 사용하여 프로그래밍 하는것을 일반화(Generic)프로그래밍이라고도 한다.

 

template은 함수나 클래스를 만들 수 있는 틀

붕어빵틀 + 재료 = 붕어빵

template + 객체 = 함수 or 클래스

일반화(Generic) = 붕어빵틀을 만드는것과 같습니다.

 

 

template을 사용하지 않고 여러 타입에 대해 동작하는 함수를 만들려면

각 타입마다 오버로딩을 해야한다는 단점이 있습니다.

 

 

template<>은 특수화 : 특정 타입에 대해서 별빵 또는 다른 기능을 수행하도록 하는 것인데

특수화도 오버로딩과 비슷하게 이해할 수 있습니다.

특수화를 하려는 타입에 대해 template를 따로 하나 더 정의하면 오버로딩을 하지 않아도 됩니다.

 

 

Template <typename T1, typename T2, …> - 여러 타입을 사용하는 template

 

 

일반적으로 h.cpp에 선언과 정의를 따로 하여 template을 적용하면 문제가 발생합니다.

Template은 구체화를 compile타임에 하기 때문에 다른 번역 단위에 있으면 문제가 발생합니다.

 

 

myFunc(1.4, (double)8)의 암묵적인 변환은 허용되지 않습니다. 리터럴 그대로의 타입으로 해석되는데

이런 경우를 위해 사용자가 직접 타입을 강제하는 문법을 사용합니다.

myFunc<double>(1.4, 8); - 함수 호출시

 

 

특수화(specialization)는 특정 타입에 대해서 따로 템플릿을 정의하는 것을 말합니다.

<char*>생략해도 되지만 생략하지 않는걸 권장문자열과 문자열을 붙이는 함수 특수화

 

 

Class template – 함수 template과의 차이점에 초점

선언방법에 차이점은 없지만 클래스와 함수의 구조적 차이점으로 인해 클래스 템플릿을 사용할 때 반드시 타입을 명시해 줘야 합니다.

명시해주는 방법은 함수 템플릿의 구체화 지정과 동일합니다.

 

 

클래스 템플릿 구체화에 대한 이해

(객체생성)인스턴스화가 되기 전(=생성자가 호출되기 전)에 먼저 객체를 위한 메모리가 할당되어야 하는데 메모리 할당을 위해서는 생성자에 전달되는 인수의 타입을 미리 알아야 합니다. (여기서 객체에서 사용되는 타입은 클래스 멤버변수의 타입을 말합니다.)

 

 

Memcpy(string.h)

매번 같은 내용의 구조체생성은 번거로우며 이미 생성하여 값을 저장한 구조체나 메모리를 다른 곳에 복사할 경우, memcpy를 사용하여 다른 곳에 복사할 수 있습니다.

Memcpy(목적지포인터, 원본포인터, 크기)

 

 

중첩 클래스 (1) – 중첩 클래스 소개 (nested class)

 

중첩 클래스 (2) – private 중첩 클래스 사용

 

중첩 클래스 (3) – 템플릿과 중첩 클래스의 결합

 

 

Memory dump뜨는 방법 : 어셈블리어 특정 부분에 메모리 특정번지에 저장하는 인스트럭션을 추가한다.

Comments