컴퓨터 계측 및 실습 C++ 기초 영남대학교 기계공학부
C 와 C++ 100 130 30 50 #include <stdio.h> void main() { int left,top,right,bottom; int MyunJyuk; left=30; top=100; right=50; bottom=130; MyunJyuk=(right-left)*(bottom-top); printf("면적 : %d m\n",MyunJyuk); } 100 130 30 50
C 에서 Structure 의 이용 구조체 (Structure) 란 ? - 편의상 단일 명칭하에 함께 묶어 놓은 하나 이상의 변수들의 모임 - 이때 변수들은 제각기 다른 데이터 형을 가질 수 있다. - 장점 1) 여러 개의 변수를 한 개의 이름으로 사용가능 2) 연관된 데이터를 하나로 묶을 수 있다. - 방법 주소록 서적 사각형 성 명 주 소 전화번호 Fax 생 일 저 자 제 목 출판사 출판연도 왼쪽 좌표 오른쪽 좌표 아래쪽 좌표 위쪽 좌표 구조체의 선언 구조 Structure 구조체명 { 데이터형 변수명1, 변수명2 ; };
C 에서 Structure 의 이용 예 #include <stdio.h> struct Sakak { int left,top,right,bottom; }; int surface(int x1,int y1,int x2,int y2) int S; S=(x2-x1)*(y2-y1); return S; } void main() struct Sakak rc; int MyunJyuk; rc.left=30; rc.top=100; rc.right=50; rc.bottom=130; MyunJyuk=surface(rc.left,rc.top,rc.right,rc.bottom); printf("면적 : %d m\n",MyunJyuk);
OOP (Object Orient Programming) - 개체 지향형 프로그램밍 - 자동차를 설계하는데, 승용차, 오픈카, 웨곤 스포츠카를 각각 설계하면 많은 설계작업이 필요 - 승용차(예:아반테)를 설계하고, 이를 변화시켜 스포츠카, 웨곤, 오픈카를 설계하면 설계가 용이 - 프로그래밍에서도 유사한 방법이 적용가능 - 이때, 승용차가 하나의 객체(Object)로 지정하고 그 설계를 이어 받아 다른 형태의 스포츠카나 오픈카로 변경하면 많은 부분의 설계를 추가작업 없이 이어 받을 수 있다. (속성계승 또는 상속) - 또한 다른 기능도 추가 가능 오픈카 소형차
C++ 에서 Class 란? - 변수 뿐만 아니라 함수도 정의 가능 - Class 로 선언된 변수 하나는 하나의 개체 (Object) 라 한다. 개체 지향 언어 Class 선언의 기본 구조 구조체의 선언 구조 Structure 구조체명 { 데이터형 변수명1, 변수명2 ; }; class 클래스명{ public: 변수명1, 변수명2; 함수명1(데이터형 변수명3) { 함수내용; } private: 변수명4, 변수명5; 함수명2(데이터형 변수명6) 객체 생성자 객체 파괴자 };
#include <stdio.h> class Sakak { public: int left,top,right,bottom; private: int surface() { int S; S=(right-left)*(bottom-top); return S; } void printS(void) { printf("면적 : %d m\n",surface()); Sakak(){ // a) 객체 생성자 ~Sakak(){ // b) 객체 파괴자 }; void main() { Sakak rc; // c) rc.left=30; // d) rc.top=100; // e) rc.right=50; // f) rc.bottom=130; // g) rc.printS(); struct Sakak { int left,top,right,bottom; }; int surface(int x1,int y1,int x2,int y2) { int S; S=(x2-x1)*(y2-y1); return S; } C 에서의 malloc 과 같은 개념 C 에서의 delete 와 같은 개념
*생성자에 따라 객체의 생성이 달라짐 #include <stdio.h> include <stdio.h> class Sakak { public: int left,top,right,bottom; private: int surface() { int S; S=(right-left)*(bottom-top); return S; } void printS(void) { printf("면적 : %d m\n",surface()); Sakak(){ // a) 객체 생성자 ~Sakak(){ // b) 객체 파괴자 }; void main() { Sakak rc; // c) rc.left=30; // d) rc.top=100; // e) rc.right=50; // f) rc.bottom=130; // g) rc.printS(); include <stdio.h> class Sakak { private: int x1,y1,x2,y2; int surface() { int S; S=(x2-x1)*(y2-y1); return S; } public: void printS(void) { printf("면적 : %d m\n",surface()); Sakak(int left,int top,int right,int bottom){ x1=left ; y1=top; x2=right; y2=bottom; ~Sakak(){ printf("Good bye\n"); }; void main() { Sakak rc(30,100,50,130); rc.printS(); *생성자에 따라 객체의 생성이 달라짐
스코우프 연산자 - 표시 방법 형선언 Clas명::함수명 - 용도 ; 어떤 클래스에 속한 함수인지를 명확하게 해주는 역할 - 용도 ; 어떤 클래스에 속한 함수인지를 명확하게 해주는 역할 - Class 선언부의 내용이 길어지고 복잡해지면, Class 선언부에서는 함수의 이름만 포함하고 나중에 상세내용을 지정할 때 쓰인다. - 일반적으로 Class 는 .h 라는 헤더 파일에서 지정하고, 그 멤버 함수들은 스코우프 연산자를 이용하여 .cpp 파일에서 작성한다.
#include <stdio.h> class Sakak { private: int x1,y1,x2,y2; int surface(); public: void printS(void); Sakak(int left,int top,int right,int bottom); ~Sakak(); }; int Sakak::surface() { int S; S=(x2-x1)*(y2-y1); return S; } void Sakak::printS(void) { printf("면적 : %d m\n",surface()); Sakak::Sakak(int left,int top,int right,int bottom) { x1=left ; y1=top; x2=right; y2=bottom; Sakak::~Sakak() { printf("Good bye\n"); void main() { Sakak rc(30,100,50,130); rc.printS(); 스코우프 연산자 프로그램 코딩이 복잡해지고 길어지면 대개는 이러한 방식으로 작성한다. 물론 두가지 방식을 혼용해서 사용할 수도 있다. 그리고 "::" 는 스코우프 연산자라고 하며, 함수가 어떠한 클래스에 있는지를 알려주는 중요한 연산자
다중정의(Overloading) - C++ 에서는 같은 이름의 다른 객체를 생성할 수 있다. 객체 다중정의 포함하는 인수의 형태는 서로 달라야 한다. - 또한 같은 이름의 함수를 여러 개 사용할 수 있다. 함수 다중정의 포함하는 인수의 형태는 역시 서로 달라야 한다. 즉 같은 내용의 함수이라도 주고 받는 데이터 형이 다른 경우에 함수이름은 변하지 않고 그 인수의 데이터 형에 맞는 함수를 호출한다.
객체 다중정의 (Overloading) 예 #include <stdio.h> class Sakak { private: int x1,y1,x2,y2; int k; int surface() { int S; S=(x2-x1)*(y2-y1); return S; } public: void printS(void) { printf("면적 : %d m\n",surface()); Sakak(int left,int top,int right,int bottom){ x1=left ; y1=top; x2=right; y2=bottom; k=1; Sakak(int left,int top){ x2=110 ; y2=120; k=2; Sakak(void){ x1=0; y1=0; x2=0; y2=0; k=3; ~Sakak(){ printf("Good bye %d\n",k); }; void main() { Sakak rc1(30,100,50,130); Sakak rc2(30,100); Sakak rc3; rc2.printS(); rc1.printS(); rc3.printS(); } 순서주의! 개체생성자가 3개 ? <결과화면> 면적 : 1600 m 면적 : 600 m 면적 : 0 m Good bye 3 Good bye 2 Good bye 1
다형성 (polymorphism) <결과> printdata(zz,(char)cc); 로 바뀌면? - 함수 다중정의의 다른 이름 #include <stdio.h> void printdata(int x,int y,int z) { // A) printf("Hi A), %d %d %d\n",x,y,z); } void printdata(int x,int y) { // B) printf("Hi B), %d %d\n",x,y); void printdata(int x,char c) { // C) printf("Hi C), %d %c\n",x,c); void main() { int xx,yy,zz,cc; xx=32; yy=33; zz=34; cc='K'; printdata(xx,yy,zz); // a) printdata(xx,yy); // b) printdata(zz,cc); // c) 매개변수의 갯수나, 데이터형(Type)에 따라 동일한 함수명(printdata)을 가졌다 할지라도 전혀 다른 함수명으로 간주 <결과> Hi A), 32 33 34 Hi B), 32 33 Hi B), 34 75 printdata(zz,(char)cc); 로 바뀌면?
Dynamic Object - 프로그램 실행하면서 중간에 클래스에 의한 객체를 생성하거나 파괴할 수 있다. - 이러한 객체를 포인터로 지정 및 사용가능하다. #include <stdio.h> class Sakak { private: int x1,y1,x2,y2; int surface() { int S; S=(x2-x1)*(y2-y1); return S; } public: void printS(void) { printf("면적 : %d m\n",surface()); Sakak(int left,int top,int right,int bottom){ x1=left ; y1=top; x2=right; y2=bottom; ~Sakak(){ printf("Good bye \n"); }; void main() { // Sakak rc(30,100,50,130); // a) Sakak *rc = new Sakak(30,100,50,130); // b) // rc.printS(); // c) rc->printS(); // d) delete rc; // e) printf("End\n"); // f) } 객체를 포인터로 선언 포인터로 선언된 객체의 멤버함수나 멤버변수 사용방법 면적 : 600 m Good bye End 만일 delete rc; 가 없다면?
속성계승 (Inheritance) class Volume : public Sakak { #include <stdio.h> class Sakak { protected: int x1,y1,x2,y2; int surface() { int S; S=(x2-x1)*(y2-y1); return S; } public: void printS(void) { printf("면적 : %d m\n",surface()); Sakak(int left,int top,int right,int bottom){ x1=left ; y1=top; x2=right; y2=bottom; ~Sakak(){ printf("Good bye \n"); }; class Volume : public Sakak { protected: int h; public: Volume(int left,int top,int right,int bottom,int height) : Sakak(left,top,right,bottom) { h=height; } ~Volume(){ printf("Good bye volume\n"); void printV(void){ printf("체적 : %d\n",h*surface()); }; void main() { // Sakak rc(30,100,50,130); // rc.printS(); Volume vc(30,100,50,130,2); vc.printV(); Volume 은 Sakak 의 파생클래스 Sakak 내의 속성을 상속받는다. 이미 만들어 놓은 Class 는 가급적 건드리지 않고 파생클래스를 만들어서 사용하면 프로그램을 수정하기 쉽다 Reuse 의 개념
클래스 계층 Sakak Avante Volume Avante Wagon Tiburon Tiburon Class Sakak() Open Car Class Sakak() { }; Class Volume:public Sakak() Sports Car New Sports 복잡한 계층의 한 예
MFC 란? - Microsoft Foundation Class (마이크로 소프트 사의 기반 클래스) - Visual C++ 과 함께 제공되는 내장 클래스(Library Class) - Visual C++ 를 사용해 윈도우 프로그램을 간단하게 개발할 수 있는 유용한 클래스 - 기본 Window 의 형태들은 새로 만들지 않고 MFC 를 상속받아 그냥 쓰면 된다. 프로그래머의 작업시간을 단축시켜줌
MFC 클래스의 기본구조 *화면상에 작동하는 모든 것(Ex:메뉴, 툴바, 상태바, etc)은 CWnd 를 상속받아 만들어짐
CWnd 를 상속받은 클래스들
멤버함수의 재정의 (Overriding) !!! Overloading 과 혼돈주의 부모클래스의 특정함수를 자식 클래스에서 재정의하여 호출. 사용할 수 있다는 것 class Volume : public Sakak { protected: int h; public: Volume(int left,int top,int right, int bottom,int height) : Sakak(left,top,right,bottom) { h=height; } ~Volume(){ printf("Good bye volume\n"); void printV(void){ printf("체적 : %d\n",h*surface()) void printS(void) { // d) printf("너비 : %d\n",surface()); } // f) }; void main() { Sakak rc(30,100,50,130); Volume vc(30,100,50,130,2); vc.printS(); // g) vc.printV(); #include <stdio.h> class Sakak { protected: int x1,y1,x2,y2; int surface() { int S; S=(x2-x1)*(y2-y1); return S; } public: virtual void printS(void) { // a) printf("면적 : %d m\n",surface()); } // c) Sakak(int left,int top,int right,int bottom){ x1=left ; y1=top; x2=right; y2=bottom; ~Sakak(){ printf("Good bye \n"); };
Application 프로그램 구조 인스턴스(Instance) 윈도안에 상주하는 하나의 집 윈도 클래스 인스턴스 안에 거주하는 하나의 윈도 윈도 클래스 인스턴스 안에 거주하는 또 하나의 윈도 프로그램이 실행되면 윈도에 등록되고, 이때 인스턴스를 부여받는다. 인스턴스 를 부여받으면 보통 작업표시줄에 해당 인스턴스명이 출력된다.
Window 프로그램의 종류 (1) Single Document Interface (SDI) (2) Multiple Document Interface (MDI) (3) Dialog Base
SDI (Single Document Interface) 의 구성 메인프레임(MainFrame) 메뉴 툴바 뷰 윈도(View) 템플릿 (Template) 도큐먼트(Document) 3개의 클래스가 연결되어 하나의 템플릿을 형성
MDI (Multiple Document Interface)의 구성 메인프레임(MainFrame) 자식프레임 (ChildFrame) 템플릿 (Template) 뷰 윈도(View) 도큐먼트(Document) 3개의 클래스가 연결되어 하나의 템플릿을 형성
Dialog base
간단히 Visual C++ 프로그램 만드는 방법 - Visual C++ Application Wizard 사용 - 기본 템플릿을 자동적으로 만들어 준다. - 윈도우 메시지를 처리할 수 있는 기본 함수들을 제공한다. - 윈도우 프로그래밍시의 단순 반복작업을 줄여서 프로그래머가 프로그램의 내용에 충실하게 해준다.
프로그램을 실행시켜 보자