Chapter 13. 템플릿(Template) 1

Slides:



Advertisements
Similar presentations
6 장. printf 와 scanf 함수에 대한 고찰 printf 함수 이야기 printf 는 문자열을 출력하는 함수이다. – 예제 printf1.c 참조 printf 는 특수 문자 출력이 가능하다. 특수 문자의 미 \a 경고음 소리 발생 \b 백스페이스 (backspace)
Advertisements

1 08 배열. 한국대학교 객체지향연구소 2 C 로 배우는 프로그래밍 기초 2 nd Edition 배열  동일한 자료유형의 여러 변수를 일괄 선언  연속적인 항목들이 동일한 크기로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는.
1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
01_ 가상 함수를 사용한 다형성의 구현 02_ 오버라이딩
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
ㅎㅎ C++ 프로그래밍의 첫 걸음 C++로 프로그래밍한다는 것의 의미 세상에서 가장 간단한 C++ 프로그램
ㅎㅎ C++ 프로그래밍의 첫 걸음 C++ 프로그래밍 기초 : 객체지향의 시작 C++로 프로그래밍한다는 것의 의미
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
최윤정 Java 프로그래밍 클래스 상속 최윤정
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 07. 반복실행을 명령하는 반복문.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
Java로 배우는 디자인패턴 입문 Chapter 5. Singleton 단 하나의 인스턴스
컴퓨터 프로그래밍 기초 [Final] 기말고사
8. 객체와 클래스 (기본).
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 12. 포인터의 이해.
5장 배열 작성자 : 변재현.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 01. 이것이 C언어다.
윤성우의 열혈 C++ 프로그래밍 Chapter C++에서의 구조체 윤성우 저 열혈강의 C++ 프로그래밍 개정판.
Chapter 25. 메모리 관리와 메모리의 동적 할당
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
제 3장. C보다 나은 C++ II.
1. C++ 시작하기.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
Chapter 06. printf 함수와 scanf 함수 정리하기
26. 매크로와 전처리기.
정적 멤버 변수/정적 멤버 함수 - friend 함수/클래스 template
C++ Espresso 제12장 템플릿.
23장. 구조체와 사용자 정의 자료형 2.
메시지 큐[5] – test1.c 메시지 제어: msgctl(2) #include <sys/msg.h>
6장. printf와 scanf 함수에 대한 고찰
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 03. 변수와 연산자.
14장. 포인터와 함수에 대한 이해.
14. 예외처리.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
11장. 1차원 배열.
13. 연산자 오버로딩.
제14장 예외처리와 템플릿 예외 처리의 개요를 학습한다. 예외 처리를 적용할 수 있다. 템플릿의 개념을 이해한다.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 21. 문자와 문자열 관련 함수.
27장. 모듈화 프로그래밍.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
19. 함수 포인터와 void 포인터.
Lesson 2. 기본 데이터형.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
Chapter 02. 자바 기본 문법.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 22. 구조체와 사용자 정의 자료형1.
컴퓨터 프로그래밍 기초 [01] Visual Studio 설치 및 사용방법
12. 상속 : 고급.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
객체기반 SW설계 팀활동지 4.
Chapter 16. C++ 형 변환 연산자와 맺는 글
Chapter 15. 예외처리(Exception Handling)
Chapter 2 C++ 함수와 네임스페이스. 최호성.
중복 멤버의 처리 조 병 규 한 국 교 통 대 학 교 SQ Lab..
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
3. 모듈 (5장. 모듈).
Chapter 27. 파일의 분할과 헤더파일의 디자인
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 23. 구조체와 사용자 정의 자료형2.
Static과 const 선언 조 병 규 한 국 교 통 대 학 교 SQ Lab..
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 04. 클래스의 완성.
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 05. 복사 생성자.
17장. 문자열 01_ 문자열 사용의 기본 02_ 문자열의 사용.
1장 C 언어의 개요 C 언어의 역사와 기원 C 언어의 특징 프로그램 과정 C 프로그램 구조 C 프로그램 예제.
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 07. 상속의 이해.
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
수업 내용 수업 목표 강의 내용 강의 계획서 교과서 및 참고도서 평가 방법 수강생의 학습 방법 제안 강의자료 사이트
상속 (Inheritance) private 전용부분 전용부분 공용부분 공용부분 public 기본 클래스
6 객체.
Presentation transcript:

Chapter 13. 템플릿(Template) 1 윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 13. 템플릿(Template) 1

Chapter 13-1. 템플릿(Template)에 대한 이해와 함수 템플릿 윤성우의 열혈 C++ 프로그래밍 Chapter 13-1. 템플릿(Template)에 대한 이해와 함수 템플릿 윤성우 저 열혈강의 C++ 프로그래밍 개정판

함수를 대상으로 템플릿 이해하기 윤성우의 열혈 C++ 프로그래밍 일반함수 템플릿화의 중간 단계 템플릿화 완료 T를 int로 하여서 만들어진 함수를 호출하면서 15와 20을 전달하라! T를 double로 하여서 만들어진 함수를 호출하면서 2.9와 3.7을 전달하라!

컴파일러가 생성하는 템플릿 기반의 함수 윤성우의 열혈 C++ 프로그래밍 Add<int>( ... ) 의 함수호출 문을 처음 컴파일할때 이 함수가 만들어진다. Add<double>( ... ) 의 함수호출 문을 처음 컴파일할때 이 함수가 만들어진다.

호출하기가 좀 불편한 건 있네요. 윤성우의 열혈 C++ 프로그래밍 template <typename T> T Add(T num1, T num2) { return num1+num2; } 호출하기 불편하지 않다! 컴파일러가 전달인자의 자료형을 통해서 호출해야 할 함수의 유형을 자동으로 결정해주기 때문이다. 전달되는 인자를 통해서 컴파일러는 이를 다음과 같이 해석한다. Add<int>(15, 20); 전달되는 인자를 통해서 컴파일러는 이를 다음과 같이 해석한다. Add<double> 2.9, 3.7)

함수 템플릿과 템플릿 함수 윤성우의 열혈 C++ 프로그래밍 함수의 형태로 정의된 템플릿이기 때문에 함수 템플릿이라 한다. 즉, 이는 템플릿이지 호출이 가능한 형태의 함수가 아니다. 이는 템플릿 함수이다. 템플릿을 기반으로 컴파일러에 의해서 생성된 함수이기 때문이다. 즉, 이는 함수이지 템플릿이 아니다.

둘 이상의 형(Type)에 대해 템플릿 선언하기 윤성우의 열혈 C++ 프로그래밍 이렇듯 콤마를 이용해서 둘 이상의 형에 대해서 템플릿을 선언할 수 있다. 실행결과 템플릿의 선언에 있어서 키워드 typename과 class는 같은 의미로 사용된다.

함수 템플릿의 특수화(Specialization): 도입 윤성우의 열혈 C++ 프로그래밍 대소비교 함수 템플릿! 큰 값을 반환한다. 정수, 실수 그리고 문자를 대상으로는 Max 함수의 호출의 의미를 갖는다. 그러나 문자열을 대상으로 호출이 되면 의미를 갖지 않는다! 문자열의 길이비교가 목적인 경우 어울리는 함수! 일반적인 상황에서는 Max 템플릿 함수가 호출되고, 문자열이 전달되는 경우에는 문자열의 길이를 비교하는 Max 함수를 호출하게 할 수 없을까? → 함수 템플릿의 특수화 등장 배경

함수 템플릿의 특수화(Specialization): 적용 윤성우의 열혈 C++ 프로그래밍 함수 템플릿 Max를 char * 형에 대해서 특수화 함수 템플릿 Max를 const char * 형에 대해서 특수화 실행결과

함수 템플릿의 특수화(Specialization): 비교 윤성우의 열혈 C++ 프로그래밍 template <> char* Max(char* a, char* b) { . . . . } const char* Max(const char* a, const char* b) 특수화하는 자료형의 정보가 생략된 형태 template <> char* Max<char *>(char* a, char* b) { . . . . } const char* Max<const char *>(const char* a, const char* b) 특수화하는 자료형의 정보를 명시한 형태

Chapter 13-2. 클래스 템플릿(Class Template) 윤성우의 열혈 C++ 프로그래밍 Chapter 13-2. 클래스 템플릿(Class Template) 윤성우 저 열혈강의 C++ 프로그래밍 개정판

템플릿 클래스의 객체생성시 자료형의 정보는 생략이 불가능하다! 클래스 템플릿의 정의 윤성우의 열혈 C++ 프로그래밍 일반 클래스 클래스의 템플릿화 int main(void) { Point<int> pos1(3, 4); // 템플릿 클래스 Point<int> 형 객체 생성 pos1.ShowPosition(); Point<double> pos2(2.4, 3.6); // 템플릿 클래스 Point<double> 형 객체 생성 pos2.ShowPosition(); Point<char> pos3('P', 'F'); // 템플릿 클래스 Point<char> 형 객체 생성 pos3.ShowPosition(); return 0; } 템플릿 클래스의 객체생성시 자료형의 정보는 생략이 불가능하다!

클래스 템플릿의 선언과 정의의 분리 윤성우의 열혈 C++ 프로그래밍 함수의 선언 템플릿 외부의 함수정의 SimpleTemplate :: SimpeFunc( . . . . ) √ SimpleTemplate 클래스의 멤버함수 SimpleFunc를 의미함 SimpleTemplate<T> :: SimpleFunc( . . . . ) √ T에 대해서 템플릿으로 정의된 SimpleTemplate의 멤버함수 SimpleFunc를 의미함 template <typename T> √ <T>가 들어가면 이 T가 의미하는 바를 항상 설명해야 한다.

헤더파일과 소스파일의 구분 윤성우의 열혈 C++ 프로그래밍 #include <iostream> #include "PointTemplate.h“ using namespace std; int main(void) { Point<int> pos1(3, 4); pos1.ShowPosition(); Point<double> pos2(2.4, 3.6); pos2.ShowPosition(); Point<char> pos3('P', 'F'); pos3.ShowPosition(); return 0; } #ifndef _ _POINT_TEMPLATE_H_ #define _ _POINT_TEMPLATE_H_ template <typename T> class Point { private: T xpos, ypos; public: Point(T x=0, T y=0); void ShowPosition() const; }; #endif 헤더파일 소스파일 1 #include <iostream> #include "PointTemplate.h“ using namespace std; template <typename T> Point<T>::Point(T x, T y) : xpos(x), ypos(y) { } void Point<T>::ShowPosition() const { cout<<'['<<xpos<<", "<<ypos<<']'<<endl; } 기준에 의해서 헤더파일과 소스파일을 잘 구분하였다. 그러나 컴파일 오류가 발생한다! 이유는? 소스파일 2

파일을 나눌 때에는 고려할 사항이 있습니다. 윤성우의 열혈 C++ 프로그래밍 #include <iostream> #include "PointTemplate.h“ using namespace std; int main(void) { Point<int> pos1(3, 4); pos1.ShowPosition(); Point<double> pos2(2.4, 3.6); pos2.ShowPosition(); Point<char> pos3('P', 'F'); pos3.ShowPosition(); return 0; } #ifndef _ _POINT_TEMPLATE_H_ #define _ _POINT_TEMPLATE_H_ template <typename T> class Point { private: T xpos, ypos; public: Point(T x=0, T y=0); void ShowPosition() const; }; #endif 헤더파일 소스파일 1 위의 소스파일을 컴파일 할 때 Point<int>, Point<double>, Point<char> 템플릿 클래스가 만들어져야 한다. 따라서 Point 클래스 템플릿의 정의 부에 대한 정보도 필요로 한다. 해결책 1. 클래스 템플릿의 정의 부를 담고 있는 소스파일을 포함시킨다. 해결책 2. 헤더파일에 클래스 템플릿의 정의 부를 포함시킨다.

배열 클래스의 템플릿화 윤성우의 열혈 C++ 프로그래밍 자료형에 따른 각각의 배열 클래스 위의 배열들을 대체할 수 있는 배열 기반의 클래스 템플릿 지금까지 설명한 내용을 바탕으로 배열 클래스 템플릿을 직접 완성하기 바란다. 이는 지금까지 공부한 내용의 복습 또는 연습에 해당한다.

Chapter 13이 끝났습니다. 질문 있으신지요?