12 장 템플릿 (template) Sung-Min Jung Internet Management Technology Lab. School of Information & Communication Engineering, Sungkyunkwan Univ. 300 Cheoncheon-dong, Jangan-gu, Suwon-si, Gyeonggi-do, Korea. Tel : , Fax :
컴퓨터 공학 실습 템플릿 (template) 에 대한 이해 IntroTemplate1.cpp int Add(int a, int b) { return a+b; } template T Add(T a, T b) { return a+b; } 템플릿화
컴퓨터 공학 실습 함수 템플릿 함수 템플릿 vs. 템플릿 함수 둘 이상의 타입에 대해서 템플릿화 IntroTemplate3.cpp 함수 템플릿의 특수화 SepciFuncTemplate2.cpp template int SizeOf(T a) { return sizeof(a); } template<> int SizeOf(char* a) { return strlen(a); } 특수화
컴퓨터 공학 실습 클래스 템플릿 class Data { int data; public: Data(int d){ data=d; } void SetData(int d){ data=d; } int GetData(){ return data; } }; template class Data { T data; public: Data(T d){ data=d; } void SetData(T d){ data=d; } T GetData(){ return data; } }; 템플릿화 int main(void) { Data d1(0); d1.SetData(10); Data d2('a');.....
컴퓨터 공학 실습 2 5 template class Data { T data; public: Data(T d){ data=d; } void SetData(T d){ data=d; } T GetData(){ return data; } }; 선언 / 정의 분리 template class Data { T data; public: Data(T d); void SetData(T d); T GetData(); }; template Data :: Data(T d){ data=d; } template void Data :: SetData(T d){ data=d; } template T Data :: GetData(){ return data; } 12-3 클래스 템플릿
컴퓨터 공학 실습 템플릿의 원리 이해 그림 12-2
13 장 예외처리 Sung-Min Jung Internet Management Technology Lab. School of Information & Communication Engineering, Sungkyunkwan Univ. 300 Cheoncheon-dong, Jangan-gu, Suwon-si, Gyeonggi-do, Korea. Tel : , Fax :
컴퓨터 공학 실습 기존의 예외처리 방식 int main(void) { int a, b; cout<<" 두개의 숫자 입력 : "; cin>>a>>b; cout<<"a/b 의 몫 : "<<a/b<<endl; cout<<"a/b 의 나머지 : "<<a%b<<endl; return 0; } int main(void) { int a, b; cout<<" 두개의 숫자 입력 : "; cin>>a>>b; if(b==0){ cout<<" 입력오류 !"<<endl; } else { cout<<"a/b 의 몫 : "<<a/b<<endl; cout<<"a/b 의 나머지 : "<<a%b<<endl; } return 0; } 예외 처리 일반적이지 않은 프로그램의 흐름의 처리 에러가 아니다 !
컴퓨터 공학 실습 C++ 의 예외처리 메커니즘 try catch try { /* 예외 발생 예상 지역 */ } catch( 처리 되어야 할 예외의 종류 ) { /* 예외를 처리하는 코드가 존재할 위치 */ }
컴퓨터 공학 실습 C++ 의 예외처리 메커니즘 try & catch throw try { /* 예외 발생 예상 지역 */ } catch( 처리 되어야 할 예외의 종류 ) { /* 예외를 처리하는 코드가 존재할 위치 */ } throw ex; // ex 를 가리켜 보통은 그냥 “ 예외 ” 라고 표현을 한다.
컴퓨터 공학 실습 C++ 의 예외처리 메커니즘 그림 13-2
컴퓨터 공학 실습 C++ 의 예외처리 메커니즘 int main(void) { int a, b; cout<<" 두개의 숫자 입력 : "; cin>>a>>b; try{ if(b==0) throw b; cout<<"a/b 의 몫 : "<<a/b<<endl; cout<<"a/b 의 나머지 : "<<a%b<<endl; } catch(int exception){ cout<<exception<<" 입력."<<endl; cout<<" 입력오류 ! 다시 실행 하세요."<<endl; } return 0; } 그림 13-3
컴퓨터 공학 실습 C++ 의 예외처리 메커니즘 OOhandlingflow.cpp 예외가 발생하면 try 블록의 나머지 부 분 무시 예외 처리 후 catch 블록 이후부터 실행 int main(void) { int a, b; cout<<" 두개의 숫자 입력 : "; cin>>a>>b; try{ cout<<"try block start"<<endl; if(b==0) throw b; cout<<"a/b 의 몫 : "<<a/b<<endl; cout<<"a/b 의 나머지 : "<<a%b<<endl; cout<<"try block end"<<endl; } catch(int exception){ cout<<"catch block start"<<endl; cout<<exception<<" 입력."<<endl; cout<<" 입력오류 ! 다시 실행 하세요."<<endl; } cout<<"THANK YOU!"<<endl; return 0; }
컴퓨터 공학 실습 Stack Unwinding( 스택 풀기 ) int divide(int a, int b); // a/b 의 몫만 반환 int main(void) { int a, b; cout<<" 두개의 숫자 입력 : "; cin>>a>>b; try{ cout<<"a/b 의 몫 : "<<divide(a, b)<<endl; } catch(int exception){ cout<<exception<<" 입력."<<endl; cout<<" 입력오류 ! 다시 실행 하세요."<<endl; } return 0; } int divide(int a, int b) { if(b==0) throw b; return a/b; } 그림 13-5 그림 13-4
컴퓨터 공학 실습 Stack Unwinding( 스택 풀기 ) 그림 13-7 그림 13-8
컴퓨터 공학 실습 Stack Unwinding( 스택 풀기 ) 예외가 처리되지 않으면 stdlib.h 에 선언되어 있는 abort 함수의 호출에 의해 프로그램 종료 unhandle_exp1.cpp, unhandle_exp2.cpp 전달되는 예외 명시 그 이외의 예외가 전달되면 abort 함수의 호출 int fct(double d) throw (int, double, char *) {..... }
컴퓨터 공학 실습 2 17 하나의 try, 여러 개의 catch catch_understand.cpp, catch_over1.cpp, catch_over2.cpp Stack Unwinding( 스택 풀기 ) int main(void) { int num; cout<<"input number: "; cin>>num; try{ if(num>0) throw 10; // int 형 예외 전달. else throw 'm'; // char 형 예외 전달. } catch(int exp){ cout<<"int 형 예외 발생 "<<endl; } catch(char exp){ cout<<"char 형 예외 발생 "<<endl; } return 0; }
컴퓨터 공학 실습 예외상황을 나타내는 클래스의 설계 예외 상황을 나타내는 클래스 & 객체 예외 클래스, 예외 객체 일반 클래스, 객체와 다르지 않다. 예외 상황을 알려주기 위한 용도로 사용 catch_over1.cpp 예외는 클래스의 객체로 표현되는 것이 일반적
컴퓨터 공학 실습 예외를 나타내는 클래스와 상속 catch 블록에 예외가 전달되는 방식 inheri_catch1.cpp, inheri_catch2.cpp 그림 13-9 그림 13-10
컴퓨터 공학 실습 new 연산자에 의해 전달되는 예외 bad_alloc new 연산자가 메모리 공간 할당을 실패 했을 때 발생시키는 예외 using std::bad_alloc; int main(void) { try{ int i=0; while(1){ cout<<i++<<" 번째 할당 "<<endl; double(*arr)[10000]=new double[10000][10000]; } catch(bad_alloc ex){ ex.what(); cout<<endl<<"END"<<endl; } return 0; }
컴퓨터 공학 실습 예외처리에 대한 나머지 문법 요소 모든 예외 처리 catch 블록 예외 다시 던지기 (re_throw.cpp) try{..... } catch( … ) { // … 선언은 모든 예외를 다 처리 하겠다는 선언..... } try{..... } catch(Exception& t) {..... throw; }