C++ Programming C 언어에서 C++ 언어로의전환 Seo, Doo-okok clickseo@gmail.com http://www.clickseo.com
목 차 C++ 언어개요 C 언어기반의 C++ 2
C++ 언어개요 C++ 언어개요 C++ 언어의역사및특징 통합개발환경 C 언어기반의 C++ 3
C++ 언어의역사 C++ 언어의역사및특징 1979 년, C with Classes AT&T 벨연구소의비야네스트롭스트룹 (Bjarne Stroustrup) 에의하여개발 객체지향성이더해진 C 언어의확장형 클래스개념과엄격한데이터확인 인라인 (inlining) 그리고디폴트인자 (default argument) Cfront : 최초의 C++ 컴파일러 1983 년, C++ 로이름을변경하여발표 가상함수 (virtual functions) 함수와연산자오버로딩 (function name and operator overloading) 단일라인주석 : // (two forward slashes) 4
C++ 언어의역사및특징 (cont d) C++ 언어의역사 (cont d) 1989 년, C++ 2.0 다중상속 (multiple inheritance) 추상클래스 (abstract classes) 동적멤버함수 (static member functions) 상수멤버함수 (const member functions) 보호된멤버 (protected members) 1990 년, The Annotated C++ Reference Manual 템플릿 (templates) 예외처리 (exception handling) 네임스페이스 (namespace) 새로운형변환 (new casts) 부울형 (Boolenan type) 5
C++ 언어의역사및특징 (cont d) C++ 언어의표준화과정 1998 년, C++98 : ISO/IEC 14882:1998 2003 년, C++03 : ISO/IEC 14882:2003 2005 년, TR1 (Library Technical Report 1) 오늘날대부분의 C++ 컴파일러에서지원 C++0x : ISO/IEC JTC1/SC22/WG21 C++ 표준화위원회 C++ 프로그래밍언어를위한새로운버전의비공식적인명칭 TR1 라이브러리를포함하여 C++ 표준라이브러리를확장 2010년 03월, 최신드레프트 (draft) 문서발표 : N3092 2011년말에표준완료후발표예정 C++0x 표준안이완료된이후에 TR2를계획 6
통합개발환경 통합개발환경 IDE (Integrated Development Environment) 코딩, 디버그, 컴파일, 배포등프로그램개발에관련된모든작업을하나의프로그램안에서처리하는환경을제공하는소프트웨어 종래의소프트웨어개발에서는컴파일러, 텍스트편집기, 디버거등을따로사용했다. Microsoft Visual C++ 6.0 : 상업용 Visual Studio Express Free Software http://www.microsoft.com/express/ Dev-C++ Free Software(GNU GPL), Open Source http://www.bloodshed.net/dev/ 7
C++ 언어개요 C 언어기반의 C++ C++ 스타일의입출력 데이터형과변수 배열, 문자열, 구조체 C++ 스타일의함수 네임스페이스 참조 동적메모리할당 C 언어기반의 C++ 8
C++ 스타일의입출력 간단한 C++ 프로그램구조 : 과거스타일 /* */ 간단한 C++ 프로그램구조작성자 : 서두옥콘솔출력 (Console Output) : cout 과거스타일!!! #include <iostream.h> cout << "Hello World! << endl; 9
C++ 스타일의입출력 (cont d) 간단한 C++ 프로그램구조 : 현재스타일 /* */ 간단한 C++ 프로그램구조 작성자 : 서두옥 현재스타일!!! std::cout << "Hello World! \n" << std::flush; std::cout << "Hello World!" << std::endl; 10
C++ 스타일의입출력 (cont d) 프로그램예제 : 다양한데이터출력 char ch = 'A'; int i = 10; double d = 10.12345; std::cout << "ch : " << ch << std::endl; std::cout << "i : " << i << std::endl; std::cout << "d : " << d << std::endl; std::cout << " 정수형상수 : " << 10 << std::endl; std::cout << " 실수형상수 " << " : " << 3.14 << std::endl; std::cout << " 문자형상수 : " << 'A' << std::endl; std::cout << " 문자열상수 : " << "Hello World!!!" << std::endl; 11
C++ 스타일의입출력 (cont d) 프로그램예제 : 데이터입력및출력 int a, b, res; std::cout << " 두정수입력 : " ; std::cin >> a >> b; res = a + b; std::cout << a << " + " << b << " = " << res << std::endl; 12
데이터형과변수 새로운형태의자료형 : bool bool형변수의상태는true와 false 둘중하나가될수있다. std::cout << true << std::endl; std::cout << false << std::endl; 13
데이터형과변수 (cont d) 프로그램예제 : 새로운자료형 -- bool bool state = false; if(state == true) std::cout << " 참!!!" << std::endl; else std::cout << " 거짓!!!" << std::endl; 14
변수 (variable) 데이터형과변수 (cont d) 변수이름의길이에는제한이없다. C 에서변수이름의길이제한 : 63 번째문자까지만인식 지역변수선언의위치제한이없다. int i = 100; std::cout << i << std::endl; int j = 200; std::cout << j << std::endl; 15
데이터형과변수 (cont d) 프로그램예제 : 제한없는지역변수의선언 int num; std::cout << " 원하는단 : "; std::cin >> num; for( int i = 1; i<10; i++) std::cout << num << " * " << i << " = " << num * i << std::endl; 16
데이터형과변수 (cont d) 명시적형변환 (explicit type conversion) cast 수식연산자 (cast expression operator) 임의로어떤형식에서다른형식으로데이터를변환시킨다. int i; double d = 3.14159; // i = (int)d; i = int(d); // C++ 에서만가능 std::cout << "i : " << i << std::endl; std::cout << "d : " << d << std::endl; 17
배열, 문자열, 구조체 C 언어스타일의문자열 (string) C++ 에서제공하는문자열조작함수를사용 : <cstring> #include <cstring> char str[] = "Hi~ Clickseo!!!"; char copy[1024]; int len = strlen(str); strcpy(copy, str); std::cout << " 길이 : " << len << std::endl; std::cout << "str : " << str << std::endl; std::cout << "copy : " << copy << std::endl; 18
배열, 문자열, 구조체 구조체 (structure) 구조체 (cont d) C++ 에서는구조체의태그 (tag) 가곧자료형이다. struct ; _score char int float name[12]; kor, eng, math, tot; ave; _score temp; 19
배열, 문자열, 구조체 프로그램예제 : 구조체의태그를이용한자료형 구조체 (cont d) struct ; _score char int float name[12]; kor, eng, math, tot; ave; _score temp; std::cout << " 이름 : "; std::cout << " 국어 : "; std::cout << " 영어 : "; std::cout << " 수학 : "; std::cin >> temp.name; std::cin >> temp.kor; std::cin >> temp.eng; std::cin >> temp.math; temp.tot = temp.kor + temp.eng + temp.math; temp.ave = float(temp.tot)/3; std::cout << "\n ### 출력결과 ###" << std::endl; std::cout << temp.name << " " << temp.kor << " " << temp.eng << " " << temp.math << " " << temp.tot << " " << temp.ave << std::endl; 20
C++ 스타일의함수 함수다중정의 (Function Overloading) C++ 에서함수들이동일한이름을사용할수있는기능 단, 인자의종류 ( 매개변수의자료형이나개수 ) 는달라야한다. int ADD(int, int); double ADD(double, double); ADD(10, 20); ADD(10.5, 20.5); int ADD(int a, int b) return a + b; double ADD(double a, double b) return a + b; 21
C++ 스타일의함수 (cont d) 디폴트인자 (Default Arguments) 따로값을지정해주지않은경우에선택하는인자의값 함수호출시적당한값을모르는경우에사용 매번함수를호출할때마다똑같은인자의값을적어주는것을피하는용도로사용 디폴트인자의제한 : 디폴트인자는오른쪽끝에모여있어야한다. int ADD(int, int = 0); std::cout << ADD(10) ) << std::endl; std::cout << ADD(10, 20) << std::endl; int ADD(int a, int b) return a + b; 22
C++ 스타일의함수 (cont d) 함수오버로딩 vs. 디폴트인자 int ADD(int a); int ADD(int a, int b = 0); std::cout << ADD(10) << std::endl; // error int ADD(int a) return a; int ADD(int a, int b) return a + b; 23
C++ 스타일의함수 (cont d) C 언어스타일의 in-line 화 : 매크로함수 프로그램을컴파일하기전에전처리기에의해정의된코드로치환 #define ADD(a, b) ((a) + (b)) #define ADD(a, b) ((a) + (b)) int sum; int sum; sum = ADD(10, 20); sum = (10) + (20); 적용전 preprocessing (macro expansion) 적용후 24
C++ 스타일의함수 (cont d) C++ 스타일의 in-line 화 : 인 - 라인함수 (in-line Function) 키워드 inline을이용한함수의 in-line화는컴파일러에의해처리 inline int ADD(int, int); 컴파일러에의해처리 int sum; sum = ADD(10, 20); std::cout << " 합계 : " << sum << std::endl; inline int ADD(int a, int b) return a + b; 25
네임스페이스의등장배경 네임스페이스 같은이름의함수를포함하면컴파일시문제발생 void OUTPUT(void) std::cout << "Hello World!!!" << std::endl; return; // error C2084: function 'void cdecl OUTPUT(void)' already has a body void OUTPUT(void) std::cout << "Hi~ Clickseo" << std::endl; return; OUTPUT(); 26
네임스페이스 (cont d) 네임스페이스 (namespace) 특정영역 ( 공간 ) 의범위를지정하고이름을붙여준것 이름공간이다르면 namespace A 같은이름의변수나함수의선언이허용된다. void OUTPUT(void) std::cout << "Hello World!!!" << std::endl; return; namespace B void OUTPUT(void) std::cout << "Hi~ Clickseo" << std::endl; A::OUTPUT(); B::OUTPUT(); return; 범위지정연산자 (scope resolution operator) 27
네임스페이스 (cont d) 네임스페이스에별칭부여 네임스페이스의이름이너무긴경우에는간단한별명을붙여준후에, 그별명을대신사용할수잇다. using std::cout; using std::endl; namespace Clickseo_namespace_data_temp int temp; namespace Click = Clickseo_namespace_data_temp; cout << "temp : " << Click::temp << endl; 28
프로그램예제 : 중첩된네임스페이스 using std::cout; using std::endl; namespace Clickseo namespace TEMP1 int a = 10; 네임스페이스 (cont d) namespace TEMP2 int a = 20; cout << "Clickseo::TEMP1::a : " << Clickseo::TEMP1::a << endl; cout << "Clickseo::TEMP2::a : " << Clickseo::TEMP2::a << endl; 29
네임스페이스 (cont d) 이름없는네임스페이스 다른파일에서접근제한 static 키워드를사용한전역변수나함수를정의한경우와동일한효과 using std::cout; using std::endl; using std::cout; using std::endl; namespace extern void OUTPUT(void); int temp = 10; extern int temp; void OUTPUT(void) cout << "temp : " << temp << endl; cout << "temp : " << temp << endl; OUTPUT(); return; 1.cpp 2.cpp 30
분할컴파일 namespace A void OUTPUT(void) 네임스페이스 (cont d) namespace A void OUTPUT(void); namespace B void OUTPUT(void); id) A::OUTPUT(); B::OUTPUT(); main.cpp std::cout << "Hello World!!!" << std::endl; return; namespace B void OUTPUT(void) std::cout << "Hi~ Clickseo" << std::endl; 1.cpp return; 2.cpp 31
프로그램예제 : 데이터입출력 네임스페이스 (cont d) int temp; std::cout << " 정수입력 : ; std::cin >> temp; namespace std cout??? cin??? endl??? std::cout << "temp : " << temp << std::endl; 32
네임스페이스 (cont d) 프로그램예제 : 데이터입출력 -- using using std::cout; using std::cin; using namespace std; using std::endl; int temp; cout << " 정수입력 : ; cin >> temp; cout << temp : " << temp << endl; 33
프로그램예제 : 지역변수와전역변수 네임스페이스 (cont d) using using std::cout; std::endl; int temp; int temp = 10; ::temp++; cout << " 지역변수 : " << temp << endl; cout << " 전역변수 : " << ::temp << endl; 34
참 조 참조 (Reference) 이름이존재하는메모리공간에하나의이름을더부여하는행위 참조는일종의별칭 (alias) 만드는방법 : 대상개체의형을적고참조연산자 (&) 와참조의이름을적으면된다. 참조는만드는순간초기화되어야한다 ( 단, 상수로초기화할수는없다 ). int a = 10; 1. 메모리공간할당 2. 이름부여 1000 1001 int *pa = &a; a 10 1002 int &ra = a; 1003 1. 이름하나더부여 1004 35
참 조 (cont d) 프로그램예제 : 참조 (reference) 의이해 using using std::cout; std::endl; int a = 10; int &ra = a; a++; cout << a : " << a << endl; cout << "ra : " << ra << endl; ra++; cout << a : " << a << endl; cout << "ra : " << ra << endl; 36
참 조 (cont d) 참조에의한호출 (Call by reference) using using std::cout; std::endl; void SWAP(int &, int &); int a = 10, b = 20; a b 10 20 cout << "a : " << a << ", b : " << b << endl; SWAP(a, b); cout << "a : " << a << ", b : " << b << endl; void SWAP(int &ra, int &rb) int temp; temp = ra; ra = rb; rb = temp; 37
참 조 (cont d) 프로그램예제 : 부담스러운 Call-by-value using std::cout; using std::endl; struct _score char int float ; name[12]; kor, eng, math, tot; ave; data 서두옥 70 80 90 240 70.0 void OUTPUT(_score); 서두옥 70 80 90 240 70.0 _score data = " 서두옥 ", 70, 80, 90, 240, 80.0; OUTPUT(data); d void OUTPUT(_score temp) cout << " 이름 : " << temp.name << endl; cout << " 국어 : " << temp.kor << endl; cout << " 영어 : " << temp.eng << endl; cout << " 수학 : " << temp.math << endl; cout << " 총점 : " << temp.tot tot << endl; cout << " 평균 : " << temp.ave << endl; temp 38
참 조 (cont d) 프로그램예제 : Call-by-reference using std::cout; using std::endl; struct _score char int float ; name[12]; kor, eng, math, tot; ave; void OUTPUT(const _score &); _score data = " 서두옥 ", 70, 80, 90, 240, 80.0; OUTPUT(data); d void OUTPUT(const _score &temp) temp cout << " 이름 : " << temp.name << endl; cout << " 국어 : " << temp.kor << endl; cout << " 영어 : " << temp.eng << endl; cout << " 수학 : " << temp.math << endl; cout << " 총점 : " << temp.tot tot << endl; cout << " 평균 : " << temp.ave << endl; 서두옥 70 80 90 240 70.0 data 39
동적메모리할당 C 언어스타일의동적메모리할당 동적메모리관리에쓰이는 4가지함수 표준라이브러리헤더파일 <stdlib.h> 에서찾을수있다. 메모리할당 : malloc, calloc, realloc 메모리해제 : free Memory Management malloc calloc realloc free 40
동적메모리할당 (cont d) C++ 스타일의동적메모리할당 : new, delete 연산자 new 연산자 : 동적메모리할당 메모리할당실패시 NULL 포인터반환 int *p = new int; int *arr = new int[size]; // 정수하나를저장할메모리할당 // 정수를 size 개수만큼저장할메모리할당 delete 연산자 : 동적메모리해제 delete p; delete []arr; // 할당된메모리공간해제 // 할당된메모리공간이배열일경우 41
동적메모리할당 (cont d) 프로그램예제 : 동적메모리할당 using namespace std; int i, size; cout << " 입력할학생수 : "; cin >> size; int *arr = new int[size]; if(arr == NULL) cout << " 메모리할당실패!!! " << endl; return -1; cout << "\n ### 데이터입력 ###" << endl; for(i=0; i<size; i++) cout << i << " : "; cin >> *(arr+i); cout << "\n ### 결과출력 ###" << endl; for(i=0; i<size; i++) cout << i << " : " << *(arr+i) << endl; delete []arr; 42
참고문헌 [1] 윤성우, 열혈강의 C++ 프로그래밍, 프리렉, 2007. [2] 이현창, 뇌를자극하는 C++ 프로그래밍, 한빛미디어, 2008. [3] H.M. HM Deitel, P. J. Deitel, C++ C HOW TO PROGRAM : 6th Edition, Prentice Hall, 2009. [4] 서두옥, 이동호 ( 감수 ), 또하나의 C : 프로그래밍은셀프입니다, 프리렉, 2011. [5] Wikipedie, http://www.wikipedia.org/. 이강의자료는저작권법에따라보호받는저작물이므로무단전제와무단복제를금지하며, 내용의전부또는일부를이용하려면반드시저작권자의서면동의를받아야합니다. Copyright Clickseo.com. All rights reserved. 43