Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Oops/내용/2014.11.07: Difference between revisions

From ZeroWiki
imported>miura0806
No edit summary
 
imported>miura0806
No edit summary
Line 1: Line 1:
__TOC__
== 내용 ==
== 내용 ==
=== 함수 템플릿 ===
=== 함수 템플릿 ===
Line 50: Line 51:
  template<class T>
  template<class T>
  void swapValues(T& var1, T& var2) {
  void swapValues(T& var1, T& var2) {
T temp;
    T temp;
temp = var1;
    temp = var1;
var1 = var2;
    var1 = var2;
var2 = temp;
    var2 = temp;
  }
  }
  // 배열은 할당될 수 없음
  // 배열은 할당될 수 없음
Line 59: Line 60:
  swapValues(a, b);
  swapValues(a, b);
=== 클래스 템플릿 ===
=== 클래스 템플릿 ===
* 클래스를 일반화할 수 있다
* 템플릿 함수와 동일하게 작동
* 예시 :  
* 예시 :  
  template<class T>
  template<class T>
Line 70: Line 73:
     T second;
     T second;
  };
  };
* 으헤헿헤ㅔ헤헤헤헿헿ㅎ헤헤ㅔ헤헤헤ㅔㅔㅔ헤중간저장
* 예시 2 :
 
template<class T>
 
Pair<T>::Pair(T firstVal, T secondVal) {
 
    first = firstVal;
* 템플릿과 상속
    second = secondVal;
}
template<class T>
void Pair<T>::setFirst(T newVal) {
    first = newVal;
}
* 매개 변수로서의 클래스 템플릿
**
int addUP(const Pair<int>& thePair);
** 클래스 타입 매개 변수 T를 대체하기 위해 int가 사용됨
** Pair<int>는 보통 일반 클래스 타입과 동일하게 사용 가능
** 템플릿 타입은 보통 타입이 사용되는 것과 똑같이 사용될 수 있다
* 타입 매개 변수에 제한
** 할당 연산자가 잘 정의되어야 한다
** 복사 생성자가 작동해야 한다
** T의 포인터가 제공된다면 소멸자가 적절히 작동해야 한다
* 타입 정의
**
typedef Pair<int> PairOfInt;
* Friend와 Template
** 프렌드 함수가 템플릿과 함께 사용될 수 있다
=== 템플릿과 상속 ===
* 파생 템플릿 클래스
** 템플릿 클래스 또는 일반 클래스로부터 상속될 수 있다
** 템플릿 클래스의 자식 클래스는 자연히 템플릿 클래스가 되어야 한다



Revision as of 06:55, 7 November 2014

내용

함수 템플릿

  • 변수 타입으로 실제 타입 이름이 아니라 매개변수를 사용
  • 실행시 보다 정확한 정의가 결정됨
  • 오버로딩이 간단해짐
  • 필요할 때마다 정의를 생성한다
  • 예시 :
template<typename(class) T>
T max(const T& a, const T& b) {
    return (a > b) ? a : b;
}
    • template<typename T> : 템플릿 전위문
    • 뒤따라 나오는 것이 템플릿이라는 것을 컴파일러에 알려줌
    • T는 형 매개변수라는 것을 컴파일러에 알려줌
  • 예시 2 :
cout << max(3, 5);            // T is int
cout << max(4.3, 5.6);        // T is double
cout << max(4, 5.5);          // Error
cout << max<double>(4, 5.5);  // OK - 명시적 형변환
  • More than one argument :
template<typename T1, typename T2>
void print_max(const T1& a, const T2& b)
{ ... }
    • 사용되지 않는 템플릿 매개 변수가 있으면 안 된다
    • 하나의 타입 매개변수만 쓰는 것이 보다 일반적이다
  • 컴파일러 복잡성
    • 함수 선언과 정의
    • 분리하여 많이 사용한다
    • 템플릿의 경우 : 대부분의 컴파일러에서 지원하지 않음
    • 템플릿 함수 정의를 호출이 되는 파일에 위치시키는 것이 안전하다
    • 많은 컴파일러에서 정의가 호출보다 위쪽에 위치해야 한다
    • 모든 템플릿 정의를 #include으로 첨부하는 방법을 많이 쓴다
  • 알고리즘 추상화
    • 템플릿을 구현하는 것
  • 템플릿 구현 전략
    • 함수를 평범하게 개발한다 : 실제 데이터 사용
    • 일반 함수로서 완전히 디버깅을 끝낸다
    • 템플릿으로 바꾼다
    • Why?
    • 컴파일러는 구체화된 템플릿 함수에 대해서만 에러 체크를 할 뿐, 템플릿 자체에 대해서는 상세한 점검 불가
    • 컴파일러는 템플릿의 모양만 기억해 둘 뿐 구문상의 에러 체크를 하지 않음
    • 오타가 있거나 if = for + while; 같은 말도 안되는 구문까지도 일단은 컴파일됨
  • 템플릿에 부적절한 타입
    • 템플릿에 적합한 타입이 사용되어야 한다
    • 할당 연산자가 정의되지 않은 타입은 쓸 수 없다
    • 예 : 배열
template<class T>
void swapValues(T& var1, T& var2) {
    T temp;
    temp = var1;
    var1 = var2;
    var2 = temp;
}
// 배열은 할당될 수 없음
int a[10], b[10];
swapValues(a, b);

클래스 템플릿

  • 클래스를 일반화할 수 있다
  • 템플릿 함수와 동일하게 작동
  • 예시 :
template<class T>
class Pair {
public:
    Pair();
    Pair(T firstVal, T secondVal);
...
private:
    T first;
    T second;
};
  • 예시 2 :
template<class T>
Pair<T>::Pair(T firstVal, T secondVal) {
    first = firstVal;
    second = secondVal;
}
template<class T>
void Pair<T>::setFirst(T newVal) {
    first = newVal;
}
  • 매개 변수로서의 클래스 템플릿
int addUP(const Pair<int>& thePair);
    • 클래스 타입 매개 변수 T를 대체하기 위해 int가 사용됨
    • Pair<int>는 보통 일반 클래스 타입과 동일하게 사용 가능
    • 템플릿 타입은 보통 타입이 사용되는 것과 똑같이 사용될 수 있다
  • 타입 매개 변수에 제한
    • 할당 연산자가 잘 정의되어야 한다
    • 복사 생성자가 작동해야 한다
    • T의 포인터가 제공된다면 소멸자가 적절히 작동해야 한다
  • 타입 정의
typedef Pair<int> PairOfInt;
  • Friend와 Template
    • 프렌드 함수가 템플릿과 함께 사용될 수 있다

템플릿과 상속

  • 파생 템플릿 클래스
    • 템플릿 클래스 또는 일반 클래스로부터 상속될 수 있다
    • 템플릿 클래스의 자식 클래스는 자연히 템플릿 클래스가 되어야 한다