전체
주요 개념
함수 템플릿
- 개념
- 함수의 일반화된 선언
- 특징
- 헤더파일과 구현파일을 분리하면 안된다.
- 컴파일 타임에 모든 연산이 끝나기 때문.
- 함수에 대해 사용하면 함수 템플릿, 클래스에 대해 사용하면 클래스 템플릿
- 헤더파일과 구현파일을 분리하면 안된다.
- 동작 과정
- 임의의 타입으로 작성된 함수에 특정 타입을 매개변수로 전달하면, 컴파일러가 알아서 해당 타입에 맞는 함수를 생성함.
- 함수 템플릿이 각각의 타입에 대해 처음으로 호출될 때, 컴파일러가 해당 타입의 인스턴스를 생성함.
- 이후에 해당 타입의 함수 템플릿이 사용될 때마다 호출됨.
- 임의의 타입으로 작성된 함수에 특정 타입을 매개변수로 전달하면, 컴파일러가 알아서 해당 타입에 맞는 함수를 생성함.
정의 방법
1 2 3 4 5
template <typename 타입이름> // 함수의 원형 { // 함수의 본체 }
Ex00
주요 개념
- 함수 템플릿
과제 구현
Q&A
컴파일 에러 발생
<algorithm>
에 존재하는 min과 겹쳐서 발생한 문제.- 해결책
- 함수 오버로딩을 통해 통해 동일한 함수명의 함수를 여러개 구현하는 것 (현재 사용불가)
::min
과 같이 호출하기- 컴파일러로 하여금 현재 namespace 말고 global namespace에서 함수를 찾게끔 한다.
<algorithm>
에 정의된 함수를 건너뛰고 사용자 정의 함수를 호출할 수 있게 됨
Ex01
주요 개념
- 함수 템플릿
- 함수 포인터
Ex02
주요 개념
클래스 템플릿
- 개념
- 클래스의 일반화된 선언
- 특징
- 타입에 따라 다르게 동작하는 클래스 집합을 만들 수 있다.
- 함수 템플릿과 다르게 객체 생성시에 반드시 자료형을 명시해야 한다.
- 함수 템플릿은 인자를 통해 데이터형을 유추할 수 있기 때문.
선언 방법
1 2 3 4 5
template <typename 타입이름> class 클래스템플릿이름 { // 클래스 멤버의 선언 }
선언 예시
1 2 3 4 5 6 7 8 9 10 11
template <typename T> class Data { private: T data_; public: Data(T dt); data(T dt); T get_data(); };
객체 생성 예시
1
Array<int> numbers(4);
과제 구현
- Array
- 메인함수
- int 배열
- char 배열
- string 배열
- 구현 확인
- 깊은 복사 확인
- 복사 생성
- 복사 할당
- 예외 처리
- 배열의 길이가 0인 경우
- 생성자의 인자가 없는 경우
- 깊은 복사 확인
- 디폴트 생성자
빈 배열을 할당한다.
1
int* arr = new int[0];
빈 배열 (empty array)
- 인덱스에 접근하는 것처럼 실제로 사용하는 것은 불가능하다.
- delete로 메모리 해제하는 것은 implementation-defined behavior이므로 피해야 한다.
- implementation-defined behavior : 정의되지 않은 동작. (컴파일러&표준 라이브러리 등의 구현에 따라 동작이 달라짐)
- 실제로 메모리를 할당하는 것이 아니기 때문에 memory leak의 위험성은 없다.
- C에서는 malloc(0)의 동작이 implementation-defined behavior이었기 때문에 할당할 수도 있고, 안할수도 있었던 거였음.