<BAF1C1EABEF320435F432B2B20C7D9BDC9C1A4B8AE2E687770>

Similar documents
Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

PowerPoint Presentation

Microsoft PowerPoint - additional08.ppt [호환 모드]

C++ Programming

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

<4D F736F F F696E74202D20C1A C0E520B5B5C5A5B8D5C6AE20C6C4C0CF20C0D4C3E2B7C220B9D720B4D9BEE7C7D120BAE420C5ACB7A1BDBA2E BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - ch07 - 포인터 pm0415

PowerPoint Template

쉽게 풀어쓴 C 프로그래밍

슬라이드 1

설계란 무엇인가?

설계란 무엇인가?

C++ Programming

Microsoft PowerPoint - C++ 5 .pptx

Microsoft PowerPoint - chap06-2pointer.ppt

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

윤성우의 열혈 TCP/IP 소켓 프로그래밍

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

윈도우 프로그래밍의 개념

PowerPoint 프레젠테이션

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

5장 MFC기반 다지기

Microsoft PowerPoint - Chapter 6.ppt

PowerPoint Presentation

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

Microsoft PowerPoint - 8ÀÏ°_Æ÷ÀÎÅÍ.ppt

Microsoft PowerPoint - chap03-변수와데이터형.pptx

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - [2009] 02.pptx

Microsoft PowerPoint - additional01.ppt [호환 모드]

슬라이드 1

K&R2 Reference Manual 번역본

금오공대 컴퓨터공학전공 강의자료

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

Visual C++의 개요

4 장클래스와객체 클래스와객체 public과 private 구조체와클래스객체의생성과생성자객체의소멸과소멸자생성자와소멸자의호출순서디폴트생성자와디폴트소멸자멤버초기화멤버함수의외부정의멤버함수의인라인함수선언 C++ 프로그래밍입문

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을

PowerPoint Presentation

C++ Programming

chap10.PDF

11장 포인터

JAVA PROGRAMMING 실습 08.다형성

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

C++ Programming

Microsoft PowerPoint - additional07.ppt [호환 모드]

윈도우시스템프로그래밍

PowerPoint Template

Microsoft PowerPoint - additional03.ppt [호환 모드]

gnu-lee-oop-kor-lec06-3-chap7

Microsoft PowerPoint - additional06.ppt [호환 모드]

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

JAVA PROGRAMMING 실습 05. 객체의 활용

1. 클래스와배열 int 형배열선언및초기화 int ary[5] = 1, 2, 3, 4, 5 ; for (int i = 0; i < 5; i++) cout << "ary[" << i << "] = " << ary[i] << endl; 5 장클래스의활용 1

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

Microsoft PowerPoint - hci2-lecture3.ppt

Microsoft PowerPoint - Chap12-OOP.ppt

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Slide 1

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap01-C언어개요.pptx

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - chap10-함수의활용.pptx

PowerPoint Presentation

11장 포인터

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

Microsoft PowerPoint - 03_(C_Programming)_(Korean)_Pointers

10.0pt1height.7depth.3width±â10.0pt1height.7depth.3widthÃÊ10.0pt1height.7depth.3widthÅë10.0pt1height.7depth.3width°è10.0pt1height.7depth.3widthÇÁ10.0pt1height.7depth.3width·Î10.0pt1height.7depth.3width±×10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width¹Ö pt1height.7depth.3widthŬ10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width½º, 10.0pt1height.7depth.3width°´10.0pt1height.7depth.3widthü, 10.0pt1height.7depth.3widthº¯10.0pt1height.7depth.3width¼ö, 10.0pt1height.7depth.3width¸Þ10.0pt1height.7depth.3width¼Ò10.0pt1height.7depth.3widthµå

Microsoft PowerPoint - hci2-lecture3.ppt

PowerPoint Template

슬라이드 1

Microsoft PowerPoint - 2강

Microsoft PowerPoint - chap12-고급기능.pptx

1. 상속의기본개념 다음과같은문제를위한클래스설계 자동차 속성 : 색상, 배기량, 현재속도 메서드 : 가속하라, 멈춰라, 시동을켜라 트럭 속성 : 색상, 배기량, 현재속도, 최대중량 메서드 : 가속하라, 멈춰라, 시동을켜라 택시 속성 : 색상, 배기량, 현재속도, 요금,

Microsoft PowerPoint - chap11-포인터의활용.pptx

Windows 8에서 BioStar 1 설치하기

PowerPoint 프레젠테이션

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

ISP and CodeVisionAVR C Compiler.hwp

윈도우시스템프로그래밍

The C++ Programming Language 4 장타입과선언 4.11 연습문제 Hello,world! 프로그램을실행시킨다. 프로그램이컴파일되지않으면 B3.1 을참고하자. #include<iostream> //#include 문, 헤더파일, 전처리지시

17장 클래스와 메소드

5장. JSP와 Servlet 프로그래밍을 위한 기본 문법(완성-0421).hwp

Slide 1

Microsoft PowerPoint - e pptx

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

1. 표준입출력 C++ : C의모든라이브러리를포함 printf, scanf 함수사용가능예 : int, double, 문자열값을입력받고출력하기 #include <cstdio> int ivar; double dvar; char str[20]; printf("int, dou

금오공대 컴퓨터공학전공 강의자료

Chapter #01 Subject

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

설계란 무엇인가?

Slide 1

윤성우의 열혈 TCP/IP 소켓 프로그래밍

1. 기본형의형변환복습 C/C++ 형변환의종류 자동형변환 ( 묵시적형변환 ) 강제형변환 ( 명시적형변환 ) 기본형의자동형변환의예 1. 배열 to 포인터변환 배열명은해당배열의첫번째원소의 주소로변환됨 int ary[10]; int *pary = ary; 2. 함수 to 포

<432B2BC7C1B7CEB1D7B7A1B9D628BABBB9AE5FC3D6C1BE295B315D2E687770>

3. 1 포인터란 3. 2 포인터변수의선언과사용 3. 3 다차원포인터변수의선언과사용 3. 4 주소의가감산 3. 5 함수포인터

Transcription:

비쥬얼 C/C++ 핵심이해 (CPP 12 계명 ) 1. 기본적인문법, 데이터유형, 연산자지역변수전역변수정적변수 : 정적지역변수, 정적전역변수 변수의선언 Type name Byte other name range int 4 signed, signed int -32,768 ~ 32,767 unsigned int 4 unsigned 0 to 2^32-1 char 1 signed char -128 to 127 unsigned char 1 unsigned char 0 to 255 short 2 unsigned short 2 Long 4-2,147,483,648 ~ 2,147,483,64 unsigned long 4 float 4 double 8 long double 10 visual C++ 에만적용 _int8 1 char, signed char _int16 2 short, short int, signed short int 0 to 2^16-1 _int32 4 _int64 8 const 변수 const를이용하여프로그램내에서값을변경하지않도록할수있다. const float PI=3.141592; const int NUM=123; const는만들면서바로초기화하여야한다. 나중에값을바꾸려고하면에러가발생한다. 2. 항거리언접두코드 prefix f ch v n b w 플래그문자형 void 숫자바이트워드 (word) meaning - 1 -

u p h m_ sz 부호없는정수포인터핸들클래스멤버 Null 로끝나는문자열 g 3. C++ 연산자 연산자유형 연산자기호 산술연산자 (Arithmetic Operator) +, -. *. / 할당연산자 (Assignment Operator) =, +=, -=, *=, /=, %= 증가 / 감소연산자 (Increment/Decrement Operator) ++, -- 관계연산자 (Relational Operator) ==,!=, <, >, <=, >= 논리연산자 (Logical Operator) &&,,! 비트단위연산자 (Bitwise Logical Operator) &,, ^, ~, >>, <<, >>=, <<=, *note1 * note 1 포인터연산자로쓰일때 & 는주소연산자라고하고, * 는참조연산자라고합니 다. 4. 조건과루프문 keyword structure description if(s1) // 몸체 A부분 if else if(s2) // 몸체 B부분 s1이참이면몸체 A 부분실행, s1니거짓이고 s2 가참이면몸체 B 부분실행, s1 과 s2 모두가거짓이면몸체나머지부분실행 else // 몸체나머지부분 while while(s1) // 몸체부분 s1을수행한결과가참인동안몸체부분을수행함 do while do 몸체부분을먼저수행하고난후 s1문장을수행하 // 몸체부분며그결과가참인동안몸체부분을게속수행함 while(s1); - 2 -

for switch for (s1; s2; s3) // 몸체부분 switch(s1) case 값A:.// 몸체부분 break; case 값B:.// 몸체부분 break; default:.// 몸체부분 break; 먼저 s1을수행하고 s2를수행하고나서그결과가참이면몸체부분을수행하고그다음 s3를수행합니다. s2 문장이참인동안만몸체부분과 s3를수행함. s1의결과에일치되는 case에대한몸체부분수행후빠져나옴. 5. 배열과포인터 배열 : type arrayname[dim]; ( 예제 ) 1차원배열 : int Array[10] = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ; 2차원배열 : char Image[256][256]; 포인터 : 다른변수의주소를갖는다. 포인터의정확한이름은 ' 포인터형변수 ' 입니다 void 포인터 void 포인트는어떤데이터형도가리킬수있는포인트변수이다. ( 예제 )void 포인터 void *vp; int i=10; char c='a'; vp=&i; vp=&c; (1) 주소연산자 pvar = &Var; (2) 참조연산자 *pvalue = Value; Var = *pvalue; (3) 포인터변수초기화 ( 예제 ) Double dvar; Double* pdvar = &dvar; (4) 포인터의배열 ( 예제 ) int* PointerArray[10][10]; - 3 -

( 예제 ) 6. 함수 1) 배열의인수전달 : int a[10]; void func(int a[])... 2) 포인터의인수전달 ( 예제 ) C++ 언어의 call by pointer void call_by_pointer(int * x) // 포인트에의한호출함수 *x=*x * 2; void main() int v=10,p=20,r=30; int *pv; pv= &v; call_by_pointer(pv); // 함수호출후 v의값이바뀜 call_by_pointer(&p); // 함수호출후 p의값이바뀜 cout <<"p= " << p << endl ; 3) 레퍼런스의인수전달 int i = 20; // 일반정수형변수 int *ip = &i; // 정수형에대한포인터 int & ir = i; // 정수형에대한레퍼런스 설명 : 레퍼런스를정의하기위해주소연산자, & 를사용한다. 레퍼런스를초기화하지않고레퍼런스를정의해서는않된다. ir은현재 i의별명이고 ir에행해지는것은역으로 i에행해진다. ( 예제 ) C++ 언어의 call by reference void call_by_reference(int & x) // 레퍼런스에의한호출함수 x=x * 2; // 자동역참조된다. 역참조연산자 '*' 이필요없다. void main() int v=10,p=20,r=30; - 4 -

call_by_reference(r); cout <<"r= " << r << endl ; // 함수호출후 r 의값이바뀜 ( 예제 )C 언어의 call by reference #include <stdio.h> void func(int* data) *data=10; void main() int var=1; func(&var); //call by reference printf("%d\n", var); 4) 레퍼런스 Return( 변수반환 ) 값이아닌변수를반환하는것이다 int & max(int & x, int & y) return (x > y)? x: y; void main() int a=10,b=20,z; z=max(a, b); // z=20이된다. cout << "z= " << z << endl; max(a, b)=0; // b=0이된다. a의값 (10) 은변화없다. cout << "a= " << a << endl; 7. 동적메모리할당 1) 스택스택 (stack) 메모리는프로그램이동작하면서필요한변수들이나, 내부적으로함수를호출하면서함수의인자들을 pass하기위한임시데이터들과, 다른함수로 jump하면서현재의코드영역위치를임시로저장하기위한영역입니다. 이스택영역은무한정존재하지않기때문에너무큰지역변수를사용하게되면스택오버플로우 (Stack overflow) 가일어나서프로그램이종료되어버릴수도있습니다. 2) 합힙 (heap) 은나머지메모리공간을의미한다. 힙은실행되는동안코드와스택에할당되는 - 5 -

메모리의바깥쪽부분을사용합니다. [ 그림 ] 배열의동적할당 new 로메모리를할당하면 delete 로반드시해제한다. 3) 1 차원배열의동적할당 ( 예제 ) int *arr=new int[10];// 힙에메모리를할당함 ( 예제 ) delete a; // 메모리를힙에돌려줌 delete [] arr; // 힙으로부터배열을해제한다. 4) 2차원배열의동적할당 ( 예제 ) int (*p)[20]; // 열의수가 20인 int형 2차원배열의포인터 //5행 20열의 int형 2차원배열을동적으로할당 // 따라서 p[i][j] 형태로원소에접근할수있습니다. int (*p)[20] = new int[5][20]; // 동적 2차원배열을반환할때에는 1차원배열과같은방법 delete [] p; 5) 구조체의동적할당배열뿐만아니라구조체와같은사용자정의자료형도동적으로할당될수있다. 구조체는기본자료형에비해덩치가크기때문에동적으로할당하면메모리를많이절약할수있습니다. 구조체정의 : struct MyData char mychar; int myint; double mydouble; ; - 6 -

MyData* pdata=new MyData;// 구조체변수를동적으로할당 MyData* pdatas=new MyData[10];// 구조체배열의할당 pdata->myint='p'; pdata->mylong=1000; pdata->mydouble=10.5; delete pdata; // pdata 가가리키는동적구조체변수를반환 8. 구조체 구조체 : 사용자정의데이터유형 구조체선언의예 struct Person int age; long height; float weight; struct Person sister; // C 에서의구조체선언방법 Person brother; //C++ 에서의구조체선언방법 sister.age = 13; brother.age = 7; // 멤버변수에값할당 struct struct : : 구조체를구조체를만드는만드는키워드키워드 Person Person : : 구조체로구조체로만들어진만들어진새로운새로운데이터데이터타입타입 int int age age : : Person Person 내부의내부의멤버변수멤버변수 long long height height : : Person Person 내부의내부의멤버변수멤버변수 float float weight weight : : Person Person 내부의내부의멤버변수멤버변수 9. 객체와클래스 객체 : 데이터와데이터에대한조작을하나로묶은것. 객체는클래스가형상화 ( 인스탄스화 ) 된것 - 7 -

추상화 객체 클래스 객체 객체 객체 인스턴스화 클래스 : 객체에대한서술로서데이터와메소드를동시에갖을수있음. class 클래스명 [private: protected : public: ] 멤버데이터형1: 멤버명1, 멤버명2,; [private: protected : public: ] 멤버함수1( [ 인수1,] ) 멤버함수정의 ; 접근자 modifier: private: private 로한정된맴버들은클래스내부에서만사용될수가있으며외부나파생된클래스에서사용할수가없다. 단, friend 클래스나함수에서는사용할수가있다. protected: 클래스의밖에서는사용할수가없으나파생된클래스의맴버함수나파생된클래스의 friend 에서는사용할수가있다. public: 외부의어떤함수에서도사용할수가있다. virtual: 베이스클레스와파생클래스에사용된 overriding 함수의충돌없는공동사용을위해서는 virtual 이라는키워드를 overriding 함수앞에붙여사용한다. friend: friend 함수는클래스의멤버함수가아니라일반함수임을주목하라 friend 함수와비슷하다. 단지클래스를 friend로등록한다 - 8 -

1 class Time 2 public: 3 Time(); 4 void settime( int, int, int ); 5 void printmilitary(); 6 void printstandard(); 7 private: 8 int hour; // 0-23 9 int minute; // 0-59 10 int second; // 0-59 11 ; Public: and Private: are member-access specifiers. settime, printmilitary, and printstandard are member functions. Time is the constructor. hour, minute, and second are data members. static 맴버변수 static 변수는꼭초기화를해야하며, 클래스밖에서한다 클래스의파생 이미기존의클래스에멤버함수를추가하려면기존클래스에대한소스코드가있으면가능하지만그렇지못한경우나그럴필요가없는경우에는 C++ 에서제공하는클래스계층 (Class Hierarchy) 를이용하여원클래스를바탕으로새클래스를만들고만들어진파생클래스에원하는데이터멤버나멤버함수를추가하면된다. 파생클래스는원클래스의데이터멤버와멤버함수를물려받는다. ( 예제 ) Box 클래스에서파생된 Item 이란클래스의작성은 class Item : public Box int active; public : ; int void void isactive(); show(); hide(); 상속의의미 - 9 -

상속이란? #include #include <iostream> <iostream> class Animal // 동물클래스는 class Animal // 동물클래스는 public: public: void eat(); // 먹고 void eat(); // 먹고 void void sleep; sleep; // // 자고자고 void breathe; // 숨쉽니다. void breathe; // 숨쉽니다. ; ; Class Elephant : public Animal // 코끼리클래스는 Class Elephant : public Animal // 코끼리클래스는 public public // // 동물중의동물중의하나인데하나인데 void trumpet(); void trumpet(); void void stampede(); stampede(); ; ; Void Void Animal:;eat() Animal:;eat() cout cout << << Eating Eating <<endl; <<endl; Void Animal::sleep() Void Animal::sleep() cout << Sleepint <<endl; cout << Sleepint <<endl; Void Animal::breathe() Void Animal::breathe() cout cout << << Breathing Breathing << << endl; endl; Void Elephant::trumpting() Void Elephant::trumpting() cout << Trumpting << endl; cout << Trumpting << endl; Void Elephant::Stampede() Void Elephant::Stampede() cout << Stampeding << endl; cout << Stampeding << endl; Int main() Int main() Elephant Jumbo; Elephant Jumbo; Junbo.breathe(); Junbo.breathe(); Jumbo.trumpet(); Jumbo.trumpet(); Jumbo.breathe(); Jumbo.breathe(); Return(0); Return(0); 클래스의재활용 - 10 -

클래스선언문은헤더파일 ( 예 : CBox.h 등 ) 에선언하고 Box.cpp 파일과 Box2.cpp 파일에서는 #include 문을사용해서포함시킨다. 단중복선언을방지하기위해조건부포함문을사용한다. 즉헤더파일끼리계승을위해복잡하게서로 include를하다보면본의아니게클래스가중복정의되는수가있는데그런경우를방지하기위해서조건부컴파일전처리기 (preprocessor) 를사용한다. 일반적형태는다음과같다. #ifndef _CLASSA #define _CLASSA class classa : #endif 예제 : //program name: Box2.cpp // 포함해주어야할재활용될클래스선언문 #include "CBox.h" void main(void) overloaded 함수 C++ 에서는한클래스선언문에두개이상의같은함수이름을둘수있으며이렇게중복정의된함수를 overloaded 함수라고한다. 함수의이름은같지만함수의인자는다르다. override 함수와가상함수 (Virtual function): 멤버함수의재정의 1) overriding 함수원클래스의멤버함수명과동일한멤버함수명을원클래스에서파생된파생클래스에서도사용가능하다. 이를 overriding 함수라고한다. 오버라이딩시함수의리턴값, 함수명, 전달인자의개수, 데이터형이모두일치해야함. 상속관계에서오버라이딩된멤버함수를호출시부모클래스객체는부모클래스에있는멤버함수가호출되고, 자식클래스의객체는자식클래스의멤버함수가호출된다. 2) virtual 함수베이스클레스와파생클래스에사용된 overriding 함수의충돌없는공동사용을위해서는 - 11 -

virtual 이라는키워드를 overriding 함수앞에붙여사용한다. 가상함수는클래스안에서 friend 함수가아니고멤버함수여야한다. 가상함수들은실행중에어느가상함수를호출하여실행할지가결정나가때문에이런방식을가리켜 runtime binding 이라고한다. ( 예제 ) - 12 -

- 13 -

연산자오버로딩 (operator overloading) C++ 에서는연산자조차함수취급을받게된다. 연산자오버로딩에의해재정의된연산자를연산자함수 (operator function) 이라고한다. C++ 는 int와같은기본자료형에 +, -, *, / 등의연산을직접적용할수있지만, 문자열, 배열과사용자가정의한자료형에직접적용할수있는연산은따로제공하지않는다. 그러나클래스자료형에대하여, 그자료형에적합한연산자를정의하여사용할수있는기능을제공한다 [ 형식 ] 리턴값 operator 연산자 ( 인수1, 인수2,..) // 함수의본체 예제 : +(int) 연산자의중복예 class Date int mo, da, yr; public: Date( ) Date(int m, int, d, int y) mo=m; da=d; yr=y; void print( ) cout << mo << / << da << / << yr; Date operator+(int); // 연산자중복 ; static int dys[] = 31,28,31,30,31,30,31,31,30,31,30,31; Date Date::operator+(int num) Date dt = *this; + 가적용될 num += dt.da; 자료형. ( 첫번째인수 ) return dt; main( ) Date oldd(2,20,91); Date newd; newd = oldd + 12; newd.print( ); This pointer this 는 객체가자기자신을가리키는포인터 이다. 모든클래스가디폴트로갖고있는포인터이며자신클래스의멤버변수를클래스내에서참조해야할경우필요하다. - 14 -

class 와 struct 의비교 정의 구조체 struct Person int age; long height; float weight; 클래스 #include <iostream.h> class myclass int a; public: myclass(); // 생성자 ~myclass(); // 소멸자 void show(); ; myclass:: ::myclass() cout << In Constructor\n ; a = 10; myclass :: ~myclass~ myclass() cout<< Destructing \n ; void myclass::show() cout<<a; 변수정의 struct mystruct mys; 또는, mystruct mys; class myclass myc; 또는, myclass myc; 필드멤버 mys.a 와 mys.b myc.a 와 myc.b 프로그램내에서의클래스활용 main() myclass ob; ob.show(); return 0; 10. 템플릿클래스를템플릿으로바꾸기 1) 템플릿사용전 - 15 -

2) 템플릿적용후 #ifndef _thumbnail_h_ #define _thumbnail_h_ - 16 -

객체를사용하려면 11. MFC 및 third party 라이브러리 ( 클래스 ) 의사용 1) MFC MFC (Microsoft Foundation Class) 는 C++ 프로그래밍언어를기반으로한 Win32 응용프로그램제작을위한 C++ 클래스라이브러리의집합입니다. Win32 API 함수들은크게메시지관리, 윈도우관리, 메모리관리, 그래픽 (GDI), 운영체제의확장서비스 (OLE, WOSA 등 ) 에관련된내용으로크게나누어볼수있다. 메인프레임윈도우 (main-frame window) 클라이언트영역 (client area) 타이틀바, 메뉴바, 스크롤바와같은장식을가진메인윈도우 ) 애플리케이션의출력영역 - 17 -

출력에관련된정보를가지고있는데이터구디바이스컨텍스트 (Device Contexts) 조체윈도우즈의인터페이스를구성하는읽기전용리소스 (resource) 정보무효화사각형 (Invalidate Rect) 다시칠해야할영역메시지 (message) 이벤트를식별하기위한상수값메시지루프 (message loop) 메시지를읽어처리하는루프애플리케이션에메시지가발생했을때윈도우윈도우프로시저 (window procedure) 즈가호출하는애플리케이션의부분, 주로메시지에대한처리방법을기술 [ 표 1] 주요 MFC 클래스 큰범주 작은범주 주요클래스 설명 CObject 어플리케이션구조어플리케이션 CObject CWinApp 기본베이스클래스어플리케이션 (.EXE) 를 표현하는클래스 커멘트라우팅도큐먼트 CCmdTarget CDocument 커멘드라우팅을수행어플리케이션이다루는 데이터와파일을표현하 는클래스 뷰 CView CCtrlView 어플리케이션의데이터 CScrollView 를화면 / 프린터로표현 CFormView 하는클래스 CDaoRecordView CHtmlView CRecordView 프레임윈도우 CFrameWnd 프레임윈도우를표현하 는클래스 도큐먼트템플릿 CDocTemplate 어플리케이션의프레임 CSingleDocTemplate 윈도우, 뷰, 도큐먼트 CMultiDocTemplate 리소스를관리하는클래 윈도우, 다이얼로그, 콘트롤 스 윈도우 CWnd 윈도우를표현하는클 래스 다이얼로그박스 CDialog 다이얼로그박스를표 CCommonDialog 현하는클래스 CFileDialog 콘트롤 CEdit CListBox CListCtrl 각종콘트롤을표현하는클래스 콘트롤바 CControlBar CReBar CStatusBar CToolBar 그리기와페인팅 DC CDC CClientDC CPaintDC CWindowDC 그리기툴 CGdiObject CBitmap CBrush CFont CPalette CPen 콘트롤바를표현하는클래스 디바이스컨텍스트 (DC) 를표현하는클래스 다양한 GDI 객체를표현하는클래스 - 18 -

데이터타입 배열, 리스트, 맵템플릿 만들어진타입 CRgn CPoint CRect CSize CString CTime CArray CList CMap CPtrArray CStringArray CPtrList CStringList CMapStringToPtr CMapWordToPtr POINT, RECT, SIZE 와스트링, 날짜 / 시간을표현하는클래스 배열, 리스트, 맵의템플릿클래스 타입이정해진배열, 리스트, 맵에대한클래스 파일, 데이터베이스 파일입출력 DAO CFile CDaoWorkspace 파일입출력클래스 DAO 데이터베이스지 CDaoDatabase CDaoRecordset CDaoQueryDef CDaoTableDef CDaoException 원을위한클래스 ODBC CDatabase CRecordset CRecordView 인터넷, 네트워킹 ISAPI CHttpFilter CHttpFilterContext CHttpServer CHttpServerContext 소켓 인터넷 CAsyncSocket CSocket CSocketFile CInternetSession CInternetConnection CHttpConnection CFtpConnection CGopherConnection CInternetException ODBC 데이터베이스지원을위한클래스 웹서버 IIS 프로그래밍을위한 API 의래퍼클래스 윈도우소켓 (TCP,UDP) 프로그래밍을위한클래스 HTTP, FTP, Gopher 프로그래밍을위한클래스 OLE 컨테이너, 서버, 오토메이션등관련클래스들디버깅, 예외디버깅 CObject::Dump 덤프를위한멤버함수예외 CException 예외처리를위한클래 CArchiveException 스 CDaoException CDBException CFileException CMemoryException [ 표 1] 은 MFC 의주요클래스들을분류해놓은것입니다. 이중에서여러분이꼭알고있어야할중요한몇몇클래스들에대해간략히알아보겠습니다. - 19 -

[ 그림 2] 참조 생성된애플리케이션은다음과같이 MFC 클래스를상속받아만들어집니다. CDialog ->CAboutDlg CWinApp ->CHelloApp CDocument ->CHelloDoc CView ->CHelloView CFrameWnd ->CMainFrame 이중, MFC 애플리케이션의핵심적인뼈대를이루는것은 CWinApp, CFrameWnd, CView, CDocument 의 4 개클래스입니다. [ 그림 ] CDocuemnt, CView, CFrameWnd, CDocTemplate 사이의관계 어떻게 MFC 를정복할것인가? 물론정답이나왕도는없다. [ 표 3] 주요 MFC 클래스의중요도순위 클래스중요도간략한설명 CObject ** 모든 MFC 클래스의베이스클래스 CCmdTarget * 커멘드메시지처리 - 20 -

CWnThread * 쓰레드관련 CWinApp ***** 어플리케이션을표현하는클래스 CDocTemplate *** 도큐먼트, 뷰, 메인프레임객체와리소스릴관리하는클래스를관리 * CSingleDocTemplate * CMultiDocTemplate CDocument ***** 어플리케이션이처리하는데이터, 파일을표현 CException **** 예외처리관련 CFile ***** 파일입출력클래스 CDC ***** 디바이스컨텍스트 (DC) 클래스. 모든출력, 그리기는 CDC 를통해서합니다. CClientDC *** 클라이언트영역 DC CPaintDC *** BeginPaint(), EndPaint() 를사용하는 DC CWindowDC ** 윈도우영역 ( 타이틀바포함 ) 을표현하는 DC CGdiObject *** GDI 객체 ( 그리는도구 ) CBitmap * 비트맵을표현 CBrush ** 브러쉬 ( 채우기스타일을지정하는데사용 ) CFont ** 폰트 ( 폰트 ) CPalette ** 팔레트 CPen ** 펜 ( 펜의스타일을지정하는데사용 ) CRgn ** 영역 ( 불규칙한모양의영역을지정하는데사용 ) CMenu *** 메뉴 ( 팝업메뉴등을만들때사용 ) CDatabase ***** ODBC 데이터베이스데이터소스 CRecordset ***** ODBC 데이터베이스의레코드셋 CDaoDatabase ***** DAO 데이터베이스의데이터소스 CDaoQueryDef **** DAO 데이터베이스쿼리정의 CDaoRecordset ***** DAO 데이터베이스의레코드셋 CDaoTableDef **** DAO 데이터베이스테이블정의 CDaoWorkspace *** DAO 데이터베이스워크스페이스 CAsyncSocket ***** 비동기소켓 (TCP, UDP 프로그래밍에사용 ) CSocket ***** CArray *** CPtrArray *** CStringArray *** CList *** CPtrList *** 동기소켓 (TCP, UDP 프로그래밍에사용 ) 배열템플릿클래스 포인터배열 문자열배열 리스트템플릿 포인터리스트 CStringList *** 문자열리스트 CMap *** 맵템플릿 - 21 -

CMapStringToPtr *** 문자열 -> 포인터매핑 CMapWordToPtr *** WORD -> 포인터매핑 CInternetSession ** 인터넷세션 CInternetConnection ** 인터넷커넥션클래스 CFtpConnection ** FTP 어플리케이션에사용 CHttpConnection ** HTTP 어플리케이션에사용 CWnd CFrameWnd ***** 윈도우를표현, 대부분의윈도우메시지핸들러가선언되어있음 ) ***** 메인윈도우를표현 CControlBar * 컨트롤바 CReBar ** 리바 (6.0 에추가 ) CStatusBar ** 상대바 CToolBar ** 툴바 CPropertySheet *** 프로퍼티시트 CDialog ***** 다이얼로그박스 CCommonDialog * 공용박스 CColorDialog * 컬러선택다이얼로그 CFileDialog **** 파일열기 / 저장다이얼로그 ** 찾기 / 바꾸기다이얼로그 CFindReplaceDialog CFontDialog * 폰트선택다이얼로그 CPropertyPage **** 프로퍼티스트의페이지 CView ***** 윈도우의클라이언트영역 CCtrlView ** 콘트롤로만들어진뷰 CListView ** 리스트콘트롤뷰 CRichEditView ** 리치에티드콘트롤뷰 CTreeView ** 트리콘트롤뷰 CScrollView ***** 스크롤뷰 CFormView ***** 폼뷰 ( 다이얼로그와일반윈도우의성격을가짐 ) CDaoRecordView **** DAO 데이터베이스를위한레코드뷰 CHtmlView ** HTML 을보기뷰 CRecordView ***** ODBC 레코드셋을위한뷰 - 22 -

CEdit ** 에디트콘트롤 CListBox *** 리스트박스 CListCtrl *** 리스트콘트롤 CPoint ** POINT 래퍼 CRect ** RECT 래퍼 CSize ** SIZE 래퍼 CString ***** 문자열을다루는클래스 CTime **** 날짜 / 시간관련클래스 주요한 4 개의클래스 CWinApp, CView, CDocument, CFrameWnd 클래스의주요한멤버함수를찾아보고알아두시기바랍니다 2) Third party Library 의사용 CImageBuffer Class Library 의활용 CImageBuffer 는가상 class 이며따라서바로 CImageBuffer 객체를할당할수는없다. 대신에 CImageBuffer 의파생 class 를만들어사용하면된다. CImageBuffer 는 basic 버전과 advanced 버변이있으며 advanced 버전을사용해야하는경우 MS 사의 DirectX 9.x SDK 의설치가필요하며아래의설정을해주어야한다. MS Visual Studio 의 VC++ 의 [Tools] -> [Options] 메뉴로들어갑니다. 거기서 [Directories] 탭을선택하신후, 맨아래칸에헤더파일디렉토리경로를넣어줍니다. 예를들어 c:\mssdk\include 이런식으로 그리고이번에는라이브러리파일의경로도넣어줍니다. 예를들어 c:\mssdk\lib 이런식으로 이번엔 [Project] -> [Setting..] 메뉴로들어가서 [Link] 탭에 Object/Library Modules 가있습니다. 그밑에뭐라고쓰여있는데맨끝에파일을추가해주시면됩니다. ddraw.lib dxguid.lib 이렇게두개. - 23 -

12. 컴파일, 링크, 실행파일 MS Visual Studio에서설계, 코드작성컴파일, 링크, 실행하기단계애플리케이션위저드 (AppWizard) 는애플리케이션의기본적인틀을생성해주는유용한도구입니다. MFC 애플리케이션을개발할때는항상이애플리케이션위저드를이용하게됩니다. Hello 애플리케이션을작성할때진행했던애플리케이션위저드의각단계에대해 - 24 -

좀더자세하게알아보겠습니다. 1 단계, 애플리케이션의스타일을지정합니다 싱글도큐먼트 (Single Document) - SDI 애플리케이션을만드는데사용합니다. 멀티플도큐먼트 (Multiple Document) - MDI 애플리케이션을만드는데사용합니다. 다이얼로그기반 (Dialog based) - 다이얼로그기반의응용프로그램을만드는데사용합니다. SDI, MDI, Dialog Based 중애플리케이션의스타일을지정합니다. SDI 애플리케이션이란윈도우가하나인애플리케이션입니다. 한번에하나의도큐먼트 ( 파일 ) 를열어서작업한다고해서 SDI(Single Document Interface) 라고합니다. 이와달리여러개의도큐먼트를여러창에동시에열고작업할수있는애플리케이션을 MDI(Multiple Document Application) 이라고합니다. 처음여러분이 MFC 를공부하실때는, 창이하나인 Single Document 를많이사용합니다. 그리고, 유틸리티같은성격의작은프로그램을작성할때는다이얼로그기반 (Dialog based) 도많이작성합니다. 'Document/View Architecture Support?' 라고되어있는부분은체크된상태로둡니다. 도큐먼트 / 뷰구조를사용할것인가를체크하는데, 대부분의 MFC 애플리케이션에서는도큐먼트 / 뷰구조를사용합니다.( 뒤에서자세히설명됩니다 ) 언어는 한국어 [APPWZKOR.DLL] 을선택합니다. 이것은리소스에서사용되는언어를지정하는것으로비주얼 C++ 6.0 부터는한국어가기본적으로제공됩니다. 2 단계, 데이터베이스지원관련이단계에서는주로데이터베이스관련내용을지정합니다. 데이터베이스애플리케이션이아닌경우에는 'None' 을선택합니다. None : 데이터베이스지원을하지않습니다. Header files only : 데이터베이스사용을위해단지헤더파일만포함시킵니다. Database view without file support : 뷰를 CRecordVew 로지정합니다 Database view with file support : 뷰를 CRecordView 로지정하면서, 레코드정보에대한내용까지생성합니다. 'Database view without file support' 나 'Database view with file support' 를선택하면애플리케이션에서사용할데이터베이스를직접지정할수있습니다. 현재, 비주얼 C++ 6.0 은 ODBC, DAO, OLE DB 를지원합니다. 3 단계,OLE,ActiveX 컨트롤에관련내용 OLE 컨테이너와서버의종류를지정합니다. MS-Office 제품처럼 OLE 기능을지원하는애플리케이션을작성하는경우서버나컨테이너의지원여부를지정합니다. 'Automation' 은 OLE Automation 을지원하는애플리케이션을만드는데사용하며, 'ActiveX Controls' 은 ActiveX 컨트롤을사용하는애플리케이션을제작하는데사용합니다. - 25 -

(OLE 에대한자세한내용은본책의범위를넘기때문에, 다른책을참고하세요. 최소한 OLE 관련컨테이너, 서버, 오토메이션, OLE 컨트롤이용어정도는알아두시는것이좋습니다. OLE 기술은마이크로소프트사의핵심기술이기도합니다.) 4 단계, 인터페이스와윈속관련부분에추가할내용이부분에서선택내용은선택을해보시면, 그림이바뀌는것으로어떤모습이될지를확인해볼수있습니다. TCP/IP 나 UDP/IP 프로그래밍을하기위해윈속을사용한다면, 'Windows Socket' 을체크합니다. 'Advanced' 버튼을누르면, 몇가지더지정할수있는내용들이나타납니다. 여기서는애플리케이션에서사용할디폴트확장자를지정할수있습니다. 지정하면, 확장자가레지스트리에등록되어, 등록된확장자를가진파일에여러분이만든프로그램의아이콘이표시됩니다 ( 탐색기를통해볼때 ). 윈도우의스타일도지정할수있습니다. 분할윈도우 'Use split window' 을체크하면, 애플리케이션의뷰가자동으로분할윈도우가됩니다. 5 단계, 스타일, 주석문, 공유 DLL 사용스타일을지정합니다. 이것은비주얼 C++ 6.0 에새로추가된부분으로탐색기와비슷한모양을가지도록지정할수있습니다. 두번째는, 코멘트 ( 주석문 ) 를달아줄것인가를묻습니다. 주석문이있는편이좋습니다. 마지막으로 MFC 라이브러리를어떤형태로사용할것인가를지정합니다. As a shared DLL As a static linked library 두가지옵션이있습니다. shared DLL 을쓰면, 실행프로그램의크기는무척작아지지만, 실행프로그램이반드시 Mfc42.Dll 과 Msvcrt.Dll 를필요로합니다. 따라서, 프로그램을배포할때해당 DLL 파일도함께배포해야합니다. statically linked library 로사용하면, MFC 의함수들이실행파일에포함되어실행프로그램의크기가커지지만, 부가적인 DLL 을함께배포할필요없이단지실행파일하나만배포할수있어편리합니다. 개발과정에서는 DLL 로만드는것이좋습니다. ( 필요에따라, statically linked library 재컴파일을할수있습니다 ) 6 단계, 뷰의베이스클래스를지정합니다. 최종적으로생성될클래스의파일이름과상속받을베이스클래스를지정하는일을합니다. 뷰의종류가상당히많이있습니다. 일반적으로디폴트로되어있는 CView 를많이사용하지만, 본격적인프로그래밍할때는 CScrollView, CFormView 등을많이사용합니다. 생성될파일의이름을바꿀수도있지만거의하지않습니다. 이제, 'Finish' 버튼을누르면, 최종확인메시지가출력되고다시 'OK' 버튼을누르면파일이생성됩니다. - 26 -

객체지향윈도우즈프로그래밍은메시지천국사용자에의해발생되는메시지사용자가하는동작 ( 예를들어마우스클릭, 마우스이동, 키보드누름등 ) 하나하나를일일이 Windows 가이해할수있는메시지로만들어서이메시지를애플리케이션으로전달합니다. 그러므로여기서메시지를전달한다는의미는사용자가행한동작을 Windows 에게알려준다는의미로해석할수있습니다. 시스템에의해발생되는메시지대부분의메시지는사용자의동작에의해발생되지만, Windows 에의해서메시지가발생될수도있습니다. 예를들어 Windows 가특정윈도우의클라이언트영역을지울필요가있다는사실을발견하게되면, Windows 는이정보를 WM_PAINT 라는메시지로현재활성화된윈도우로전달합니다. 이외에도윈도우가생성될때 WM_CREATE 메시지가발생되고, 윈도우가종료되기직전에는 WM_DESTROY 메시지가발생됩니다. [ 자료출처 : "Visual C++ 입문 " 강좌 - 이승관, 박성관 ] - 27 -