11.string 클래스디자인로딩 표준 string 클래스 사용자정의클래스 Jong Hyuk Park
표준 string 클래스 Jong Hyuk Park
string 클래스 C++ 표준라이브러리에서정의된문자열처리클래스 #include <iostream> #include <string> using std::endl; using std::cout; using std::cin; using std::string; int main() string str1="good "; string str2="morning"; string str3=str1+str2; cout<<str1<<endl; t cout<<str2<<endl; cout<<str3<<endl; str1+=str2; if(str1==str3) //str1과 str3의내용비교. cout<<"equal!"<<endl; string str4; cout<<" 문자열입력: "; cin>>str4; cout<<" 입력한문자열 : "<<str4<<endl; return 0; Good morning Good morning equal! 문자열입력 : Hello! 입력한문자열 : Hello!
사용자정의 string 클래스 Jong Hyuk Park
string 클래스사용자구현 앞예의표준라이브러리를이용한 string 클래스의사용자구현 string 클래스사용자구현 생성자, 소멸자, 복사생성자정의 +, =, +=, ==, <<, >> 연산자오버로딩
사용자정의 string 클래스, 생성자, 소멸자 #include <iostream> using std::endl; using std::cout; using std::cin; using std::ostream; t using std::istream; class string int len; // null 문자를포함하는문자열의길이 char* str; public: string(const char* s=null); string(const string& s); ~string(); ; string& operator=(const string& s); string& operator+=(const string& s); bool operator==(const string& s); string ti operator+(const tstring& ti s); friend ostream& operator<<(ostream& os, const string& s); friend istream& operator>>(istream& is, string& s); // 생성자 string::string(const char* s) len=(s!=null? strlen(s)+1 : 1); str=new char[len]; if(s!=null) strcpy(str, s); // 복사생성자 string::string(const string& s) len=s.len; str=new char[len]; strcpy(str, s.str); // 소멸자 string::~string() delete []str;
연산자오버로딩 string& string::operator=(const string& s) delete []str; len=s.len; str=new char[len]; strcpy(str, s.str); return *this; string& string::operator+=(const string& s) len=len+s.len-1; char* tstr=new char[len]; strcpy(tstr, str); delete []str; strcat(tstr, t(tst s.str); str=tstr; return *this; bool string::operator==(const string& s) return strcmp(str, s.str)? false:true; string string::operator+(const string& s) char* tstr=new char[len+s.len-1]; strcpy(tstr, str); strcat(tstr, s.str); string temp(tstr); delete []tstr; return temp; ostream& operator<<(ostream& os, const string& s) os<<s.str; return os; istream& operator>>(istream& is, string& s) char str[100]; is>>str; s=string(str); return is;
실행결과 int main() string str1="good "; string str2="morning"; string str3=str1+str2; cout<<str1<<endl; cout<<str2<<endl; cout<<str3<<endl; str1+=str2; if(str1==str3) //str1 과 str3 의내용비교. cout<<"equal!"<<endl; string str4; Good morning Good morning equal! 문자열입력 : Hello! 입력한문자열 : Hello! cout<<" 문자열입력 : "; cin>>str4; cout<<" 입력한문자열 : "<<str4<<endl; return 0;
12. 템플릿 (Template) 함수템플릿 클래스템플릿 Jong Hyuk Park
함수템플릿 Jong Hyuk Park
함수템플릿소개 함수템플릿 한번의함수정의로서로다른자료형에대해적용하는함수 예 int abs(int n) return n < 0? -n :n; double abs(double n) 함수 return n < 0? -n : n; // 정수형인수의 abs() 함수 // double 형인수의 abs() 함수의인수와반환형의자료형만이다르고함수내부의프로그램코드는모두같음 템플릿함수를사용하여함수정의는한번만하고필요시자료형에따라각각적용 11
함수템플릿정의 함수템플릿은 template 키워드, typename( 또는 class) 템플릿자료형인수들를선언 템플릿의자료형이되어템플릿함수의가인수나반환형을위한자료형으로사용 template <typename Type1 [, typename Type 2 ]> 반환형함수명 ( 가인수리스트 ) 함수호출시에사용되는실인수, 반환형의자료형을컴파일러가템플릿함수의자료형인수에대입하여특정함수를생성하고호출 12
함수템플릿사용예 template <class T> T abs(t n) // T 형가인수, 반환형을갖는템플릿함수 abs() 정의 return n < 0? n : n; main() int i = abs(123); // int abs(int n) 을생성하고호출 double d = abs(-123.45); // double abs(double n) 을생성하고호출 => 함수호출시에사용된실인수, 반환형의자료형에따라두개의 abs() 함수를생성하고호출 int abs(int n) // int i = abs(123); 호출시생성 return n < 0? n : n; double abs(double n) // double d = abs(-123.45); 호출시생성 return n < 0? n : n; 13
템플릿자료형인수사용예 템플릿함수의정의시사용되는템플릿의자료형인수는함수의가인수로최소한한번이상사용되어야함 template <typenamet> T func1(t *a); // 올바름 template <typename T> T func2(t a, T b); // 올바름 template <typename T, typename T> T func2(t a, T b); // 에러, T가중복선언 template <typename T, typename U> Tf func2(t a, Ub) b); // 올바름 template <typename T, typename U, typename V> U func2(t a, V b); // 에러, U가가인수로사용되지않음 14
함수템플릿사용예 1 #include <iostream> using std::endl; using std::cout; template <typename Type> Type min(type a, Type b) // 템플릿함수 min() 정의 return a < b? a : b; int main() // int min(int,int) 템플릿함수생성, 호출 cout << min(88,24) 882 << endl; // double min(double,double) 템플릿함수생성및호출 cout << min(1.234,7.56) << endl; 24 1.234 return 0; min(88,24) 의호출시에템플릿의자료형인수 Type 이 int 로치환된 int min(int, int) 인함수가 생성되고, min(1.234, 7.56) 의호출시에는 double min(double, double) 인함수가생성 15
함수템플릿사용예 2 #include <iostream> using std::endl; using std::cout; template <typename T> // 함수템플릿정의 void ShowData(T a, T b) cout<<a<<endl; cout<<b<<endl; int main(void) ShowData(1, 2); ShowData(3, 2.5); //! error #include <iostream> using std::endl; using std::cout; template <typename T1, typename T2> // 함수템플릿정의 void ShowData(T1 a, T2 b) cout<<a<<endl; cout<<b<<endl; int main(void) ShowData(1, 2); ShowData(3, 2.5); return 0; return 0; 16
함수템플릿의특수화 #include <iostream> using std::endl; using std::cout; template <typename T> // 함수템플릿정의 int SizeOf(T a) return sizeof(a); int main(void) int i=10; double e=7.7; char* str="good morning!"; cout<<sizeof(i)<<endl; cout<<sizeof(e)<<endl; cout<<sizeof(str)<<endl; return 0; #include <iostream> using std::endl; using std::cout; template <typename T> // 함수템플릿정의 int SizeOf(T a) return sizeof(a); template<> // 함수템플릿정의 int SizeOf(char* a) return strlen(a); int main(void) int i=10; double e=7.7; 7; char* str="good morning!"; cout<<sizeof(i)<<endl; cout<<sizeof(e)<<endl; cout<<sizeof(str)<<endl; return 0; 17
클래스템플릿 Jong Hyuk Park
클래스템플릿 클래스템플릿 한번의클래스정의로서로다른자료형에대해적용하는클래스 class Counter int value; class Counter double value; public: Counter(int n) value = n; public: Counter(double n) value = n; Counter() value = 0; Counter() value = 0; int val() return value; double val() return value; void operator ++() ++value; void operator --() --value; void operator ++() ++value; void operator --() --value; ; ; 19
클래스템플릿정의및생성 template <typename Type1 [, typename Type 2 ]> class 클래스명 클래스명 < 자료형 [, 자료형, ]> 객체명 ; template <typename T> class Counter T value; public: Counter(T n) value = n; Counter() value = 0; T val() return value; void operator ++() ++value; void operator --() --value; Counter <int> oi; Counter <double> od; 20
클래스템플릿사용예 1 #include <iostream> using std::endl; using std::cout; template <typename T> class Counter T value; public: Counter(T n) value = n; Counter() value = 0; T val() return value; void operator ++() ++value; void operator --() --value; ; int main(void) Counter <int> icnt; Counter <double> dcnt(3.14); Counter <char> ccnt('c'); ++icnt; --dcnt; ++ccnt; cout << "++icnt : " << icnt.val() << endl; cout << "--dcnt : " << dcnt.val() << endl; cout << "++ccnt : " << ccnt.val() << endl; #include <iostream> using std::endl; using std::cout; template <typename T> class Counter T value; public: Counter(T n); Counter() value = 0; T val(); void operator ++(); ++value; void operator --() --value; ; template <typename T> Counter<T>::Counter(T C n) value = n; template <typename T> T Counter<T>::val() return value; int main(void) Counter <int> icnt; Counter <double> dcnt(3.14); Counter <char> ccnt('c'); 21 return 0; ++icnt; --dcnt; ++ccnt; cout << "++icnt : " << icnt.val() << endl; cout << "--dcnt : " << dcnt.val() << endl; cout << "++ccnt : " << ccnt.val() << endl; return 0;
클래스템플릿사용예 2 #include <iostream> using std::endl; using std::cout; template <typename S, typename L> class Size int s; int l; public: Size() s = sizeof(s); l = sizeof(l); void print() cout << s << ',' << l << endl; ; int main(void) Size <char, long int> a; Size <float, double> b; cout << "char,long int: "; a.print(); cout << "float,double : "; b.print(); 22 return 0;
클래스템플릿의상속 클래스템플릿도일반클래스와같이상속 베이스클래스인클래스템플릿을일반클래스가파생클래스가되어상속받는경우 베이스클래스인클래스템플릿으로부터생성된클래스를상속 클래스템플릿을생성하지않고전체를상속받으면에러 클래스템플릿인베이스클래스로부터클래스템플릿인파생클래스가상속받는경우 template <typename T> class Base ; class Derive : public Base<int> template <typename T> class Base ; template <typename U> class Derive : public Base<U> 23
클래스템플릿의상속예 #include <iostream> using std::endl; using std::cout; template <typename T> class Area // 베이스클래스템플릿 T side1, side2; public: Area(T s1, T s2) // 생성자 side1 = s1; side2 = s2; void getside(t &s1, T &s2) s1 = side1; s2 = side2; ; template <typename U> class Rectangle : public Area<U> // 파생클래스템플릿 public: Rectangle(U s1, U s2) : Area<U>(s1,s2) // 생성자 /* no operation */ U getarea(void) U s1, s2; int main(void) Rectangle <int> ir(3,14); Rectangle <double> dr(2.5, 7.3); cout << "int area : " << ir.getarea() << endl; cout << "double area : " << dr.getarea() << endl; return 0; int area : 42 double area : 18.25 클래스템플릿인파생클래스 Rectangle 이또다른 클래스템플릿인베이스클래스 Area 로부터상속받 는예이다. Rectangle 파생클래스템플릿는 Area 베이스클래스템플릿전체를상속받는다. 24 ; getside(s1,s2); return s1 * s2;
13. 예외처리 기존의예외처리방식 C++ 예외처리 Jong Hyuk Park
예외처리소개 예외처리 (exception handling) 프로그램의비정상적인상황발생시처리하는과정 대개의경우예외처리하지않는경우실행에러발생 26
예외처리없는코드예 #include <iostream> using std::endl; using std::cout; using std::cin; int main(void) int a, b; 실행결과 1 두개의숫자입력 : 5 2 a/b의몫 : 2 a/b 의나머지 : 1 cout<<" 두개의숫자입력 : "; cin>>a>>b; cout<<"a/b 의몫 : "<<a/b<<endl; cout<<"a/b 의나머지 : "<<a%b<<endl; return 0; 실행결과 2 두개의숫자입력 : 5 0 <-!!! 실행에러발생 27
전통적스타일예외처리코드예 #include <iostream> using std::endl; using std::cout; using std::cin; 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; 실행결과 1 두개의숫자입력 : 5 2 a/b의몫 : 2 a/b 의나머지 : 1 실행결과 2 두개의숫자입력 : 5 0 입력오류! 다시실행하세요. return 0; 28
C++ 예외처리 Jong Hyuk Park
C++ 예외처리 (1) try & catch try /* 예외발생예상지역 */ catch( 처리되어야할예외의종류 ) throw /* 예외를처리하는코드가존재할위치 */ throw ex; // ex 를가리켜보통은그냥 예외 라고표현을한다. // 예외상황발생통보시사용 30
C++ 예외처리 (2) 31
C++ 예외처리코드예 1 #include <iostream> using std::endl; using std::cout; using std::cin; int main(void) int a, b; 실행결과 1 두개의숫자입력 :52 a/b의몫 : 2 a/b의나머지 : 1 실행결과 2 두개의숫자입력 :50 0 입력. 입력오류! 다시실행하세요. 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; 32
C++ 예외처리코드예 2 #include <iostream> using std::endl; using std::cout; using std::cin; 두개의숫자입력 : 5 0 0 입력. 입력오류! 다시실행하세요. 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) return 0; cout<<exception<<" 입력."<<endl; cout<<" 입력오류! 다시실행하세요."<<endl; int divide(int a, int b) if(b==0) throw b; return a/b; 33
스택풀기 (Stack Unwinding) 34
C++ 예외처리코드예 예외가처리되지않으면 stdlib.h에선언되어있는 abort 함수의호출에의해프로그램종료 전달되는예외명시 그이외의예외가전달되면 abort 함수의호출 int fct(double d) throw (int, double, char *)..... 35
36 C++ 예외처리코드예 3 #include <iostream> using std::endl; using std::cout; using std::cin; 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(char exception) cout<<exception<<" 입력."<<endl; cout<<" 입력오류! 다시실행하세요."<<endl; return 0; int divide(int a, int b) if(b==0) throw b; //!! 에러, int 형 b 전달 return a/b;
C++ 예외처리코드예 4 #include <iostream> using std::endl; using std::cout; using std::cin; 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; 실행결과 1 input number: 10 int형예외발생실행결과 2 input number: -10 char형예외발생 37
#include <iostream> using std::endl; using std::cout; using std::cin; 예외처리클래스예 char* account="1234-5678"; // 계좌번호 int sid=1122; // 비밀번호 int balance=1000; // 잔액. class AccountExpt char acc[10]; int sid; public: AccountExpt(char* str, int id) strcpy(acc, str); sid=id; int main(void) char acc[10]; int id; int money; try cout<<" 계좌번호입력 : "; cin>>acc; cout<<" 비밀번호 4 자리입력 : "; cin>>id; if(strcmp(account, acc) sid!=id) throw AccountExpt(acc, id); cout<<" 출금액입력 : "; cin>>money; if(balance<money) throw money; void What() balance-=money; cout<<" 계좌번호 : "<<acc<<endl; cout<<" 잔액 : "<<balance<<endl; cout<<" 비밀번호 : "<<sid<<endl; catch(int money) ; cout<<" 부족금액: "<<money-balance<<endl; catch(accountexpt& expt) cout<<" 다음입력을다시한번확인하세요 "<<endl; expt.what(); return 0; 38
Jong Hyuk Park