개발 Study

#34. Template 및 inline

HYuk 2021. 5. 20. 03:12
728x90

# 함수 템플릿

-> 사용자가 템플릿을 만든 것을 함수 템플릿이라고 한다.

함수를 만들 때 일반적으로 매개변수나 반환값의 타입을 명시해준다.

하지만 템플릿은 자료형을 별도로 명시하지 않아도 된다.

템플릿은 다음과 같이 만든다

template <typename T>

T Add(T _a, T _b)

{

      return _a+_b;

}

 

위에서 T는 T1, T2 또는 다른 문자를 사용해도 상관 없다.

T라는 타입을 받아서 T타입으로 반환하고 T타입의 _a와 _b를 받아서 둘을 더한 것을 return 한다는 뜻이다.

이렇게 정의를 하고

사용을 할 때에는

Add<int>(10,20);

이런식으로 <>를 사용하여 안에 T가 어떤 자료형인지 알려줘야한다.

#include "stdafx.h"
#include <iostream>
using namespace std;

template <typename T>
T Add(T _a, T _b)
{
	return _a + _b;
}

int main()
{
	cout << Add<int>(1, 2) << endl;
	cout << Add<float>(2.3f, 3.5f) << endl;
    return 0;
}

이런식으로 템플릿을 이용하면

각 자료형마다 함수를 오버로딩 해주지 않아도 된다.

-> <>안에 명시한 자료형을 토대로 실제 함수를 만들지만,

사용자가 <>안에 자료형을 명시하지 않으면 매개변수 타입에 따라 자동으로 매칭되게 된다.

2가지 이상의 자료형을 사용할 경우

template <typename T1, typenameT2> 이런식으로 typename을 여러개 정의해야 한다.


 

#템플릿 오버로딩

템플릿을 오버로딩 할 수 있다.

Add로 문자 두개를 잇고 싶다고 한다면

아래와 같이 템플릿을 오버로딩 할 수 있다.

#include "stdafx.h"
#include <iostream>
using namespace std;

template <typename T>
T Add(T _a, T _b)
{
	return _a + _b;
}


template <> // 템플릿 오버로딩
const char* Add(const char* _a, const char* _b)
{
	char* _szB = new char[strlen(_a) + strlen(_b) + 1];

	strcpy_s(_szB, strlen(_a) + strlen(_b) + 1, _a);
	strcat_s(_szB, strlen(_a) + strlen(_b) + 1, _b);

	return _szB;
}

void main()
{
	cout << Add("Hello","World") << endl;
}

#inline 함수

-> 매크로 함수의 단점인

1. 복잡한 함수 구성 어려움

2. 디버깅이 불가능

이러한 부분을 보완한 함수이다.

 

inline 함수는 함수 맨 앞

즉, 반환타입 앞에 inline 이라는 키워드를 명시하면 된다.

-> inline 함수는 헤더파일에 정의부까지 정의해야된다.

따라서 파일분할을 할 수 없다.

 

인라인 함수가 일반 함수로 변경되는 경우가 있다.

1. 인라인 함수를 함수 포인터로 이용할 경우

2. 재귀 형태로 호출하는 경우

3. 원인 불분명

728x90

'개발 Study' 카테고리의 다른 글

#36. STL (Standard Template Library) 정의  (0) 2021.05.22
#35. 클래스 템플릿  (0) 2021.05.21
#33. operator 연산자 오버로딩  (0) 2021.05.18
#32. 바인딩  (0) 2021.05.14
#31. 캐스팅(형변환)  (0) 2021.05.14