Home CPP Module 07 : 템플릿
Post
Cancel

CPP Module 07 : 템플릿

전체

주요 개념

함수 템플릿

  • 개념
    • 함수의 일반화된 선언
  • 특징
    • 헤더파일과 구현파일을 분리하면 안된다.
      • 컴파일 타임에 모든 연산이 끝나기 때문.
    • 함수에 대해 사용하면 함수 템플릿, 클래스에 대해 사용하면 클래스 템플릿
  • 동작 과정
    • 임의의 타입으로 작성된 함수에 특정 타입을 매개변수로 전달하면, 컴파일러가 알아서 해당 타입에 맞는 함수를 생성함.
      • 함수 템플릿이 각각의 타입에 대해 처음으로 호출될 때, 컴파일러가 해당 타입의 인스턴스를 생성함.
      • 이후에 해당 타입의 함수 템플릿이 사용될 때마다 호출됨.
  • 정의 방법

    1
    2
    3
    4
    5
    
      template <typename 타입이름>
      // 함수의 원형
      {
          // 함수의 본체
      }
    

Ex00

주요 개념

  • 함수 템플릿

과제 구현

Q&A

  • 컴파일 에러 발생

    Untitled

    • <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이었기 때문에 할당할 수도 있고, 안할수도 있었던 거였음.

Q&A

  • 컴파일러가 함수를 못찾는 에러 발생

    Untitled

    • 해결 : hpp 파일 하단에 tpp 파일을 include

Ref.

[ C++ ] 배열 클래스와 인덱스 연산자 오버로딩

This post is licensed under CC BY 4.0 by the author.

CPP Module 06 : 타입 변환

CPP Module 08 : STL