Object-Oriented Programming and C++ 단기코스 321190 2007 년가을학기 9/6/2007 박경신 Overview Windows.NET Object-Oriented Programming C++ Class 선언, 정의, 사용 Data Encapsulation Class constructor, destructor Function, Operator Overloading Inheritance Function Overriding Virtual Function new, delete Default parameter Reference 2 Windows.NET Object-Oriented Programming 구조적프로그램에서객체지향프로그램으로 SDK(Software Development Kit): 운영체제가응용프로그램에제공하는서비스로 C언어함수의집합형태 MFC(Microsoft Foundation Class): SDK를객체지향적으로포장 ATL(Active Template Library): 분산환경컴포넌트개발 객체지향프로그래밍 (Object-Oriented Programming) 프로그램기본단위를객체 (object) 로해서프로그램을개발 프로그램기본단위 : C 는함수이고, C++ 는클래스 구조적프로그래밍 vs. 객체지향프로그래밍 예제 : 클릭한곳에 X 표하는프로그램 구조적프로그래밍 마우스가클릭되면, 클릭된점의좌표를계산 클릭된점의좌표가몇번째격자인지계산 그격자의모서리점을계산하여대각선을그리기 객체지향프로그래밍 : 각각의격자를하나의오브젝트로처리 마우스가윈도우에클릭되면, 자기자신윈도우전체에대각선을그리기 3 4
Class 객체를정의한데이터타입 Class 키워드를사용하여객체를구성하는데이터와함수들을정의 클래스의인스턴스 ( 객체 ) 를생성하여사용 Class 선언, 구현, 사용 클래스선언 클래스구현 //Point class 선언 class Point { // 데이터 ( 멤버변수 ) int _x; int _y; // 메소드 ( 멤버함수 ) void setx(int x){ _x = x; void sety(int y){ _y = y; void move(int x, int y){ //Point 객체사용 void main() { //Point 클래스의인스턴스생성 Point p; //Point 객체의함수접근 ( 호출 ) p.setx(100); p.sety(40); p.move(20, 50); 클래스사용 인스턴스 (Instance): 메모리에생성된클래스의실체 멤버변수는각인스턴스마다독립적으로생성 멤버함수는메모리에한번만로딩되고모든인스턴스가이를공유 5 6 Data Abstraction C 언어 Structure 자료추상화 (Data Abstraction) 캡슐화 (Encapsulation), 정보은닉 (Information Hiding) 캡슐화 (Encapsulation) 캡슐화의필요성 사용자는오디오의사용법만파악 사용자가오디오의반도체동작원리나내부회로까지파악하여내부부품을떼었다붙였다하고배선을끊었다이었다하면고장 C 구조체 (structure) 변수만캡슐화, 외부함수에의해수동적으로제어 C ++ 클래스 변수, 함수를캡슐화, 내부함수를통해능동적으로동작 public: 외부에서보이는변수 protected, private: 내부에만보이는변수 7 인터페이스파일과구현파일의분리 헤더파일 (.h): 인터페이스파일, 소스파일 (.c): 구현파일 헤더파일 함수프로토타입만보여줌 블랙박스 ( 정보의은닉, 구현을볼수없음 ) 계약서역할 ( 작업의정의를자세하고정확하게기술 ) /* 헤더파일의예 */ typedef struct { int _x; int _y; Point; void setx(int x); void sety(int y); void move(int x, int y); 8
Class 내부와외부 Class 내부와외부 클래스내부에서는클래스의멤버변수, 멤버함수를직접접근가능 클래스외부에서는클래스의인스턴스를통하여공개된 (public) 멤버변수, 멤버함수를접근 클래스명을선언하고포함된멤버변수와멤버함수를선언 class Date { private: public: int year; int month; int day; bool valid; bool IsValidDate(int y, int m, int d); bool SetDate(int y, int m, int d); void PrintDate(); 클래스명 :: 멤버함수 (..) 형식으로멤버함수정의 BOOL Date::IsValidDate(int y, int m, int d) { static int lenmonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31; if (y<1900 y>2006) return false; if (m<1 m >12) return false; if (d<1 d>lenmonth[m]) return false; return true; 클래스의멤버함수에서의멤버함수, 멤버변수접근 BOOL Date::SetDate(int y, int m, int d) { if (IsValidDate(y, m, d) == true) { // 멤버함수 IsValidDate() 접근 year = y; // 멤버함수에서멤버변수 year 접근 month = m; // 멤버함수에서멤버변수 month 접근 day = d; // 멤버함수에서멤버변수 day 접근 valid = true; // 멤버함수에서멤버변수 valid 접근 return true; else { valid = false; return false; ; 9 10 Class 내부와외부 클래스의외부함수에서의멤버함수, 멤버변수접근 void main() { Date MyBirthday; // Date 클래스의인스턴스생성 MyBirthday.SetDate(1987, 11, 11); // 인스턴스의공개된멤버함수접근 MyBirthday.PrintDate(); // 인스턴스의공개된멤버함수접근 if (d<1 d>lenmonth[m]) return false; return true; Class Constructor & Destructor 생성자 (Constructor) 함수 클래스를초기화하며인스턴스가생성될때호출 클래스이름 :: 클래스이름 ( 매개변수가능 ) 소멸자 (Destructor) 함수 클래스를정리하며인스턴스가소멸될때호출 클래스이름 ::~ 클래스이름 ( 매개변수없음 ) 소멸자앞에는항상 virtual 로선언 주의사항 생성자와소멸자는반환값없음 11 12
Class Constructor & Destructor Member Variables 변수 (Variables) 전역변수 : 프로그램이시작될때생성되고끝날때소멸 정적변수 : 프로그램이시작될때생성되고끝날때소멸 지역변수 : 함수가시작될때생성되고끝날때소멸 자동변수 : new 할때생성되고 delete 할때소멸 정적멤버변수 (Static Member Variables) 한클래스에서하나만생성되어모든인스턴스가공유하는변수 13 class Point { int x; int y; public: static int count; Point() { count++; // 생성자 ~Point() { count--; // 소멸자 // 인스턴스의개수를세기위한변수 ; // static( 정적 ) 변수는클래스선언부밖에서별도로선언필요, 초기화작업 Int Point::count = 100; 14 Example 클래스 CTest1 의선언 (Test1.h) 멤버변수 : m_name 멤버함수 : 생성자 (char *msg), 소멸자 클래스 CTest1 의구현 (Test1.cpp) 생성자 (char *msg): msg( 정적호출 ) 를 m_name 에저장후출력 소멸자 (): m_name 을출력 클래스 CTest1 의사용 : (main.cpp) 지역적, 정적, 동적으로 ctest1 을 3 번호출 생성자 : 지역적호출생성자 : 정적호출생성자 : 동적호출파괴자 : 동적호출파괴자 : 지역적호출 15 파괴자 : 정적호출 Polymorphism 다형성 (Polymorphism) one interface, multiple implementation Compile time 다형성 함수 Overloading 연산자 Overloading Run time 다형성 가상함수를이용한함수의 Overriding 16
Function Overloading Operator Overloading 함수오버로딩 (Function Overloading) 함수의이름은같지만함수의매개변수나반환값이다르게정의 호출시함수의매개변수개수나데이터타입에따라구별되어처리 class Overload{ public: int Max(int a, int b){ if (a > b) return a; else return b; ; double Max(double a, double b){ if (a > b) return a; else return b; ; void main(){ Overload o; int x; double y; x = c.max(10, 50); y = c.max(10.6, 50.3); 17 연산자오버로딩 (Operator Overloading) 연산자를함수처럼재정의하여사용 연산자오버로딩연산자종류 단항연산자 : ++, -- 이항연산자 : +, -, *, /, %, ^, &,, ~,!,,, =, <, >, <=, >=, <<, >>, ==,!=, ->, += 등 연산자오버로딩 Operator 키워드뒤에연산자를넣은함수이름으로구현 18 Operator Overloading 연산자오버로딩 (Operator Overloading) Point q=++p; // 오류반환값이없으므로대입불가 Inheritance 상속 (Inheritance) 이미만들어진기반클래스에구현된모든특징을그대로계승받아새로운파생클래스를생성 상위클래스 (Super class, Base class) 하위클래스 (Subclass, Derived class, Extended class) 상속을통한오브젝트의계층구조적구현 비슷한속성을여러번중복구현하는일이없어짐 새로운클래스를추가하기가쉬워짐 Point class Point{ ColoredPoint 3DPoint class 3DPoint : Point { 19 3DColoredPoint 20
Inheritance 기반클래스 (Base Class) 와파생클래스 (Derived Class) Derived Class 에서사용가능한멤버변수는 3 개 즉, BaseVariable1, BaseVariable2, DerivedVariable Derived Class 에서사용가능한멤버함수는 3 개 즉, BaseFunction1, Example 클래스 ctest2_1 멤버변수 : name( 이름 ), age( 나이 ) 멤버함수 Constructor(char *n, int a): 이름, 나이저장 show(): 이름 ( 나이 ) 를출력 클래스 ctest2_2 는 ctest2_1 을상속 멤버변수 : kor( 국어 ), eng( 영어 ), math( 수학 ), avg( 평균 ) 멤버함수 Constructor(char *n, int a, int k, int e, int m): 평균을계산하고, 이름, 나이, 국어성적, 영어성적, 수학성적, 평균성적을저장 show(): ctest2_1 의 show() 를호출하고, 국어성적, 영어성적, 수학성적, 평균성적을출력 21 22 BaseFunction2, DerivedFunction A의이름은? 이정진 A의나이는? 29 B의이름은? 수애 B의나이는? 27 B의국어성적은? 89 B의영어성적은? 75 B의수학성적은? 67 ---------------------- 학생국어영어수학평균이정진 (29세) 수애 (27세) 89 75 67 77 Overriding 재정의 (Overriding) 기반클래스의마음에안드는함수만고쳐서파생클래스에서재정의해서사용 Overriding 오버로딩 (Overloading) 과재정의 (Overriding) 오버로딩 : 동일한함수명에매개변수가다른함수를둘이상정의 int Max(int a, int b); double Max(double a, double b); 재정의 : 동일한함수명에동일한매개변수를둘이상정의 Point Class: void Show(); Point3D Class: void Show(); 단, Point3D 클래스는 Point 클래스를상속받은파생클래스 23 24
Virtual Function 바인딩 (Binding) 함수를호출하는부분에함수가위치한메모리번지를연결시켜주는작업 정적바인딩 (Static Binding) 컴파일할때호출될함수가결정 동적바인딩 (Dynamic Binding) 실행할때호출될함수가결정 가상함수 (Virtual Function) 함수를선언할때 virtual 키워드를붙여주면가상함수는동적바인딩을사용 가상함수이외의모든함수는정적바인딩으로처리 동적바인딩의효과 파생된클래스의오버라이딩된함수가제대로호출되려면반드시가상함수를오버라이딩하여동적바인딩이가능하도록처리 25 Virtual Function 가상함수의필요성 Point 클래스의 Show 함수호출 Point3D 클래스의 Show 함수호출 Point 클래스의 Show 함수호출 Point 클래스의 Show 함수호출 26 Virtual Function Inline Function 가상함수의필요성 inline 함수란 함수를호출하는위치마다코드가통째로복사 실행파일의크기는증가하지만수행속도는빨라짐 빈번히호출되며크기가매우작은함수에적합 inline 함수만드는방법 묵시적인방법 명시적인방법 Point 클래스의 Show 함수호출 Point3D 클래스의 Show 함수호출 // Point3d 인스턴스 Show 호출 // 동적바인딩 Point 클래스의 Show 함수호출 Point3D 클래스의 Show 함수호출 27 함수의선언과구현을같이해주면자동으로 inline 함수가생성 28
메모리관리 C++ 프로그램에서다룰수있는메모리의종류 정적 (static) 프로그램의시작과동시에할당되고프로그램의종료와함께해제됨 Static 을사용하거나파일범위에서선언된변수는정적이됨 자동 (automatic) 인스턴스가선언된지역에있는블록내에서유효한것으로선언된지점에서생성되고블록을벗어나는순간해제됨. Auto를사용하거나블록범위에서선언된변수는자동이됨 함수에매개변수를전달할때복사본을전달 동적 (dynamic) 블록이나프로그램과관계없이사용자가지정하는순간할당되고해제됨 New, delete 연산자를이용해서할당또는해제됨 동적할당은효과적으로메모리를사용할수있으나메모리에대한반환에유의해야함 ( 메모리누수 ) 29 연산자 new 요청된타입의개체를담을수있는크기의메모리를할당하고할당된메모리블록의주소를반환함 할당에실패할경우 bad_alloc이라는예외를발생시킴 정수타입데이터의동적할당 int *d_int = new int; 배열의동적할당 int *d_array = new int[20]; 클래스타입의동적할당 클래스의동적메모리할당시생성자를호출 Point *d_point = new Point; 30 연산자 delete 연산자 new 를통해서할당된메모리는반드시명시적으로해제해야함 Delete ID 연산자 delete 의사용법 int*d_int= new int; int *d_array = new int[20]; Point *d_point = new Point; delete d_int; delete [] d_array; delete d_point; 연산자 delete 의잘못된사용법 int i = 10; int *p = &i; delete p; // new 를이용해서할당된메모리가아니므로 error long *pl = malloc (sizeof(long)); delete pl; // new 를이용해서할당된메모리가아니므로 error Reference 개체에대한또다른명칭 으로정의됨 포인터와달리해당자원을공유하는매개일뿐실제의인스턴스가아님 레퍼런스는반드시유효한객체를레퍼런스하고있어야함 레퍼런스는처음초기화시정해진개체만을참조. 레퍼런스의사용예 int i; int & ref = i; // OK : int 타입변수 i에대한레퍼런스 ref = 10; // i의값이변경 extern int &e_ref; // OK : 레퍼런스선언 int &illegal; // error : 레퍼런스가정의되었으나초기화안됨 int *p; int *& ref_of_pointer = p; // OK : 포인터 p에대한레퍼런스 31 32
Reference 값복사에의한호출 함수에매개변수를전달할때복사본을전달 Class Template 템플릿이란 데이터형만다르고형태가같은클래스를여러번찍어낼때사용 10 20 레퍼런스에의한호출 함수에매개변수를전달할때원본을전달 20 10 33 34 Default Parameter 함수의기본인자 (Default parameter) 함수를호출할때인자를명시하지않는경우에지정한기본값이자동으로전달되는인자 함수의선언과정에서값을명시하는방법으로지정 기본인자는항상맨뒤의인자부터순차적으로지정해야함 기본인자의사용법 int f (char *, int = 1, int 100); // 함수선언시매개변수값을명시 f( yourname ); // f( yourname, 1, 100) f( yourname, 10); // f( yourname, 10, 100) f( yourname, 10, 180); // f( yourname, 10, 180) f(); // char * 에대한기본인자가없으므로 error f(10); // char * 에대한기본인자가없으므로 error Default Parameter 기본인자의사용법 35 36
This Pointer this 포인터란 현재클래스의인스턴스가위치한메모리의주소 다른클래스에자기자신을매개변수로넘겨줄때사용 Const Variables/Functions const 변수 초기화는할수있지만변경할수없는상수 const 함수 변수의값을변경할수없는읽기전용함수 37 38 Coding Rules 변수표기법 의미있는단어의사용 멤버변수는 m_ 라는접두어추가 헝가리안표기법 접두어 b d h n p 또는 lp sz u w dw str clr 의미 BOOL 형변수 double 형변수 HANDLE 형변수 int 형변수 pointer 변수 NULL 문자로끝나는문자열 unsigned int 형변수 WORD(unsigned short 형변수 ) DWORD(unsigned long 형변수 ) CString 형변수 COLORREF m_lpszfilename m_ : 멤버변수 lp : 포인터변수 sz : 널로끝나는문자열 Filename: 파일이름 39 Windows Programming 대표적인윈도우메시지 윈도우메시지발생상황 WM_CREATE 윈도우가생성될때 WM_ACTIVATE 윈도우가활성화되거나비활성화될때 WM_PAINT 윈도우가다시그려져야할때 WM_MOUSEMOVE 마우스커서가움직였을때 WM_COMMAND 사용자가메뉴등을명령으로내렸을때 WM_LBUTTONDOWN 마우스왼쪽버튼을눌렀을때 WM_LBUTTONUP 마우스왼쪽버튼을떼었을때 WM_LBUTTONDBLCILK 마우스왼쪽버튼이더블클릭됐을때 WM_KEYDOWN 키보드가눌렸을때 WM_KEYUP 키보드가떼었을때 WM_SIZE 윈도우의크기가변경되었을때 WM_MOVE 윈도우가이동되었을때 WM_TIMER 설정된타이머시간이다되었을때 WM_DESTROY 윈도우가없어질때 메시지처리기 OnCreate OnActivate OnPaint OnMouseMove OnDestroy OnLButtonDown OnLButtonUp OnLButtonDblClk OnKeyDown OnKeyUp OnSize OnMove OnTimer 40 OnDestroy