제 2 강 C++ 언어개요 이재규 leejaku@shinbiro.com
Topics C++ 언어의역사와개요 프로그래밍언어의패러다임변화 C 의확장언어로서의 C++ 살펴보기 포인터와레퍼런스 새로운메모리할당 Function Overloading, Template 객체지향언어로서의 C++ 살펴보기 OOP 의개념과실습
2.1 C++ 의역사와개요 프로그래밍언어의역사 C++ 언어의구조
프로그래밍언어의역사 1 mov ax,351ch 프로그래밍언어 컴퓨터를위한상세작업명세서 기계중심 -> 사람중심으로의변화 기계어 (Machine Language) 궁극적으로 CPU 가이해하는유일한언어 Operator + Operand Assembly Language 숫자를이해하기쉬운 Symbol 로대치 마크로등의부가기능 기본적으로기계어와동일한구조 int 21h mov word ptr OldInt1c,bx mov ax,es mov word ptr OldInt1c+2,ax
프로그래밍언어의역사 2 BASIC Beginner's All-purpose Symbolic Instruction Code 행번호기반의고급언어 제한된제어구조 (GOTO) 로스파게티코드단점 FORTRAN/COBOL 과학기술용 / 업무용고급언어 오래된시스템에서현재도많이사용하고있음 Code Abstraction : 코드뭉치를하나의 Symbol 로대체. Function or Subroutine Function Name, Argument, Body, Return Value
프로그래밍언어의역사 3 Pascal Structured Programming 순서, 선택, 반복구조로코딩 Type Abstraction + 하나의논리구조를가지는데이타들의집합 Type Name, Member Data C Low Level 프로그래밍가능한단순한구조 최소한의형식규약만갖춤 가장많이사용된다목적프로그래밍언어
프로그래밍언어의역사 4 C++ Bjarne Stroustroup 이창안 (AT&T) 1985 http://www.research.att.com/~bs/ C 언어와무엇이다른가? C 언어와의하위호환성제공 C 언어의스펙상단점을보완 reference, inline function, 변수중간선언 function overload, 새로운메모리할당 template C 언어에객체지향특성을가미 코드와데이타를통합한 class 제공 encapsulation, inheritance, polymorphism
C++ 언어의구성 Data Type Primitive data type : char, int, float, double... Derived data type : array, pointer, reference User Defined Data type : structure, union, class Operator ( 연산자 ) 산술, 할당, 비트, 논리, 관계, 선택, 멤버, 조건 구분자 : [] () {} 등 operator overloading Flow Control int sum(int a, int b) { int result = a + b; return result; } if else, switch, while, do while, for, goto, continue, break Function function name, argument, return value, body default argument, function overloading, inline function
C++ 프로그램생성 CPP 파일 CPP 파일 CPP 파일 헤더파일 전처리기 전개된 CPP CPP파일 C++ 컴파일러 OBJ 파일 OBJ 파일 OBJ 파일링커결과물
2.2 C++ : C 의확장 Pointer vs Reference 새로운메모리할당 Function overloading Default Parameter Template 기타
Pointer Pointer : 메모리의주소를가리키는변수 32 비트환경에서는 4 바이트의크기를가짐 Pointer 규정요소 주소 (Address) 와타입 (Type) 주소만있는포인터 : void pointer Pointer 연산 * (dereference operator), & (address of operator) Pointer + integer, Pointer integer Pointer Pointer Pointer 특징 Low-Level 프로그래밍가능하게한다. 하지만잘못사용하면매우위험한코드가됨
Pointer (Pictures) int nvalue = 10; int* pvalue = &nvalue; int nvalue2 = *pvalue; 100 104 108 112 116 10 nvalue 104 pvalue int arrayvalues[4] = { 10, 20, 30, 40 }; int* pvalue = arrayvalues; int nvalue; nvalue = *pvalue; // = arrayvalues[0] pvalue = pvalue + 2; // pvalue++; pvalue++; nvalue = *pvalue; // = arrayvalues[2] 100 104 108 112 116 10 20 30 40 100 arrayvalues pvalue int nindex = pvalue arrayvalues; // = 2
Reference Reference = Alias & 쉬운포인터 생성과동시에초기화되어야함 Pointer 사용할때많이실수하는점극복 Address of 연산자빼먹기 초기화되지않은포인터사용하기 int nvalue = 10; int& rvalue = nvalue; rvalue = 11; // then nvalue = 11 nvalue = 12; // then rvalue = 12 printf( %x, %x\n, &nvalue, &rvalue); // same address
Pointer vs Reference void SwapPtr(int* x, int* y) { int temp = *x; *x = *y; *y = temp; } void SwapRef(int& x, int& y) { int temp = x; x = y; y = temp; } int first = 0, second = 1; SwapPtr(&first, &second); // & 빼먹으면 crash!!! SwapPtr(first, second);
새로운메모리할당 Type-safe memory allocation : new & delete class(struct) 의 constructor 와 destructor 를호출함 // C 방식 struct Person; Person* panyone; panyone = (Person*)malloc(sizeof(Person)); if (panyone == 0) exit(0); // use panyone... free(panyone); // C++ 방식 struct Person; Person* panyone; panyone = new Person; if (panyone == 0) exit(0); // use panyone... delete panyone;
Function Overloading 같은이름의여러함수를정의할수있음 구분방법 : 인자의타입과갯수 int multiply(int a, int b) { return a * b; } double multiply(double a, double b) { return a * b; } int nresult; double dresult; nresult = multiply(10, 20); dresult = multiply(3.5, 2.1); dresult = multiply(3.5, 2.1, 1.5); dresult = multiply(10, 2.5); // 10 은 double 로 // type promotion double multiply(double a, double b, double c) { return a * b * c; }
Default Parameter 함수의인자를생략할수있음 생략할수있는인자는오른쪽끝부터차곡차곡 // prototype of function int multiply(int a, int b = 1, int c = 1, int d = 1); int multiply(int a, int b, int c, int d) { return a * b * c * d; } int nresult; nresult = multiply(5); // multiply(5,1,1,1); nresult = multiply(5, 6); // multiply(5,6,1,1); nresult = multiply(5, 6, 7); // multiply(5,6,7,1);
Template Template 이란? 파라미터화된타입으로함수나클래스를정의 Function Template, Class Template 타입에관계없는일반적 (generic) 인코드제작 template <class T> void SwapGeneric(T& a, T& b) { T temp = a; a = b; b = temp; } int i = 10, j = 20; SwapGeneric(i, j); double di = 1.5, dj = 2.5; SwapGeneric(1.5, 2.5);
기타확장들 Inline function Macro function 에 type-safe 가능하게 블럭의중간에변수정의가가능함 새로운표준입출력방식 스트림모델 : cout, cin Operator overloading 연산자의의미를재정의할수있음 Exception Handling 에러처리를간명하게
2.3 C++ : 객체지향언어 class 정의 OO : 캡슐화 OO : 계승 OO : 다형성
Class Class 의정의 class = member variables + member function 객체의상태 (state) 와행위 (method) 를결합 class는 type, object는 class의 instance class Point { private: int m_nx; int m_ny; public: void setxy(int x, int y) { m_nx = x; m_ny = y; } int getx() { return m_nx; } int gety() { return m_ny; } void WhoAreYou() { printf( Point\n ); } }; Point pt; pt.setxy(10, 5); int x = pt.getx(); int y = pt.gety();
Object Oriented Programming OOP 의세가지특징 캡슐화 (Encapsulation) 상태와행위를가지는객체로모델링 정보숨기기 (Information Hiding) : 상태의임의변경금지 계승 (Inheritance) 선조클래스로부터 Implementation을취사선택 Base Class vs Derived Class 다형성 (Polymorphism) 서로다른타입의객체를동일한방법으로사용하게함 virtual function
OOP : Encapsulation Access Specifier ( 접근지정 ) Private: 클래스외부에서접근금지 Public: 어디서나접근가능 Protected: 클래스내부와 Derived class 에서만접근 무엇을숨길것인가? 멤버데이타 / 내부함수는 private or protected 외부사용가능함수는 public ( 안전한함수만 ) 의의 데이타타입과행동 (Method) 의명시적관계 잘못된클래스사용을사전방지
OOP : Inheritance Inheritance 기존의 Implementation 을 그대로사용할수도있고, 재정의할수도있음 소프트웨어생산성을높임 single inheritance, multiple inheritance class Rectangle : public Point { private: int m_nx2; int m_ny2; public: void setx2y2(int x, int y) { m_nx2 = x; m_ny2 = y; } int getx2() { return m_nx2; } int gety2() { return m_ny2; } void WhoAreYou() { printf( Rectangle\n ); } };
OOP : Polymorphism Polymorphism 서로다른타입을한가지방법으로사용하게함 virtual function, virtual function table,late binding Derived class pointer는 Base class pointer로변환가능 class Point { private: int m_nx; int m_ny; public: void setxy(int x, int y) { m_nx = x; m_ny = y; } int getx() { return m_nx; } int gety() { return m_ny; } virtual void WhoAreYou() { printf( Point\n ); } }; Point Object vfptr m_nx m_ny WhoAreYou others... ohters...
2 강결론
결론 C++ 언어는 C 언어의장점을취하고 C언어를확장하고 객체지향특성을가미한언어이다. 객체지향의세가지특성은 Encapsulation Inheritance Polymorphism