C++ 언어의 특징 2006. 9. 12
Contents C and C++ Structure Class OOP Constructor and Destructor Classes Dynamic Memory Allocation Operator Overloading Inheritance Overriding of member function Virtual Functions this Pointer friend Reference 영상통신연구실 박 원 배
C and C++ C C++ 함수로 이루어짐 구조적 프로그래밍 Top-Down 방식 프로그램을 기능 단위로 세분 중형 프로그램 클래스로 구성 객체 지향 프로그래밍 Bottom-Up방식 프로그램을 오브젝트 단위로 세분 대형 프로그램
C and C++ int func() ; - C : 함수의 매개 변수에 대해서 모른다. - C++ : 함수에 매개 변수가 없다. int func() = int func(void) C++에서는 모든 함수가 원형으로 선언되어야 한다. C++에서는 함수의 리턴값이 있다고 선언되었으면 반드시 값을 return 해야 한다. C에서 지역 변수는 그것을 사용하는 문장 이전에 블록의 시작에서만 선언하고 , C++에서 지역 변수는 어느 곳에서나 선언 영상통신연구실 박 원 배
Structure Structure Struct Date { int year; int month; int day; }; main() { Date Birthday; Birthday.year = 1973; Birthday.month=8; Birthday.day=8; printf(“나의 생일은 %d년 %d년 %d일!”, Birthday.year,Birthday.month,Birthday.day); } Structure 데이터를 일괄적으로 관리하기 위해 사용 영상통신연구실 박 원 배
Definition of Class Class 데이터 추상화를 사용자 정의 타입으로 바꿀 수 있는 C++의 도구 데이터를 표현하는 것과 데이터를 처리하는 method를 같이 하나의 패키지로 구성 Class 클래스 정의부 : 클래스를 구성하고 있는 멤버 함수와 데이타들 클래스 method 정의부 : 클래스내에 있는 method의 구현부 영상통신연구실 박 원 배
Declaration of Class 키워드 class는 클래스 정의를 식별 클래스명은 이 사용자 정의형의 이름으로 된다. 클래스명은 이 사용자 정의형의 이름으로 된다. class Date { private : // 멤버 변수 int year; int month; int day; public : // 멤버 함수 BOOL SetDate(int y,int m,int d); void ShowDate(); }; 키워드 private는 public 구성원 함수를 통해서만 접근할 수 있는 클래스 구성원을 식별 영상통신연구실 박 원 배
Implementing Class Member Functions 멤버 함수를 정의할 때에는, 함수가 어느 클래스에 속하는 것인지를 나타내기 위하여 범위 연산자( :: ) 를 사용 클래스 method는 클래스의 private요소를 access 할 수 있다. BOOL Date :: SetDate(int y, int m, int d) { year = y; month = m; day = d; return True; } void Date :: ShowDate() printf(“%d년 %d월 %d일\n”, year,month,day); 영상통신연구실 박 원 배
Practical Use of Class Memory # include “dateclass.h” MyBirthday year main() { // Data형의 인스턴스 두개 생성 Date MyBirthday, YourBirthday; MyBirthday.SetDate(1973,7,10); YourBirthday.SetDate(1997,7,7); MyBirthday.ShowDate(); YourBirthday.ShowDate(); } MyBirthday Instance year month 멤버 변수는 각 instance 마다 독립적으로 생성 day year month YourBirthday Instance day 멤버 함수는 모든 instance가 공유 SetDate ShowDate 영상통신연구실 박 원 배
Object Oriented Programming 자세한 사항은 무시하고 본질적인 특징에 집중하도록 하는 과정 Procedural abstraction and Data abstraction 추상화 (Abstraction) 자세한 사항은 무시하고 본질적인 특징에 집중하도록 하는 과정 즉, 데이터 추상화와 절차적 추상화 기법을 묶어 하나의 단위로 취급 은닉화 (Encapsulation) 새로운 클래스가 다른 클래스에서 데이터와 함수를 상속 받아 여기에 좀더 특별한 기능을 갖게 할 수 있는 과정 상속성 (Inheritance) 같은 메시지에 대해 오브젝트가 다르게 행동 Overloading 다형성 (Polymorphism) 영상통신연구실 박 원 배
생성자(Constructor)와 소멸자(Destructor) Source1.cpp Constructor 클래스와 이름이 같고 리턴값이 없다. 클래스의 오브젝트가 생성될 때마다 자동적으로 호출되며 초기화에 사용된다. 하나의 클래스에 대하여 매개 변수가 다른 여러 개의 생성자를 선언할 수 있다. 특히, 매개변수가 없는 생성자를 디폴트 생성자라 함. Destructor 클래스의 오브젝트가 메모리 블록에서 해제될 때 자동적으로 호출되는 특별한 멤버 함수, 주로 메모리의 내용을 지울 때 사용 리턴값이 없고 선언된 타입을 갖지 않고 전달인자를 갖지 않는다. 영상통신연구실 박 원 배
클래스의 사용 객체의 치환 - 하나의 객체는 같은 형의 다른 객체에 치환될 수 있다. (source2.cpp 참고) 함수로의 객체 전달 - 인수로서 다른 자료형들을 함수에게 전달하는 것과 같은 방법으로 인수로서 객체를 함수에게 전달. Call by value 방식으로 전달 (source3.cpp 참고) 함수로부터 객체의 반환 - 객체를 반환하기 위해서는 반환형으로 클래스형을 함수와 같이 선언 - return문을 사용하여 그 형의 객체를 반환 (source4.cpp 참고) 영상통신연구실 박 원 배
Dynamic Memory Allocation malloc() 와 free() 사용 C new 와 delete 사용 C++ new 연산자는 자신이 메모리를 할당하는 오브젝트의 데이터형을 알고 있으며, 그 데이터형의 포인터를 리턴한다. new 연산자는 클래스와 같은 사용자가 정의한 추상적인 데이터형뿐 아니라, char,int 같은 내장 데이터형에도 사용 char *newarray ; newarray = new char [10] ; …… delete [] newarray ; 영상통신연구실 박 원 배
연산자 오버로딩(Operator Overloading) C++의 클래스는 내장 데이터형과 마찬가지로 오브젝트들간에 대해서도 연산기능을 부여. 즉, 연산자의 의미를 재정의하여 새로운 데이터형에 기능을 부여 operator 라는 예약어를 사용 Class Counter { private : int count; public : void operator++() { ++count ; } void operator+(Counter x); } Counter Counter:: operator+(counter x) { Counter temp; temp.count = count + x.count; return temp; } Counter a , b, c ; ++a; c = a + b; 영상통신연구실 박 원 배
상속성(Inheritance) #1 클래스간의 계층 관계에서, 상위 레벨에 있는 클래스를 먼저 구현하고 하위 레벨에 있는 클래스는 상위 클래스에 있는 모든 특성을 전달 받아 만들 수 있다. 기반 클래스(base class) - 상위 레벨에 있는 클래스 파생 클래스(derived class) - 하위 레벨에 있는 클래스 Class BaseClass { public : int basevar1; int basevar2; BaseClass(); ~BaseClass(); void basefunc1(); }; Class DerivedClass : public BaseClass { public : int derivedvar; void derivedfunc(); }; 영상통신연구실 박 원 배
protected와 private의 공통점 protected와 private의 차이 상속성(Inheritance) #2 protected와 private의 공통점 Protected 나 private로 선언된 멤버 변수와 멤버 함수는 클래스 내부에서만 접근할 수 있고, 외부에서는 접근할 수 없다. protected와 private의 차이 기반 클래스에서 선언된 protected와 public 멤버는 파생 클래스의 내부에서 사용할 수 있지만, 기반 클래스에서 private로 선언된 멤버는 파생 클래스에서 내부적으로 사용할 수 없다. 영상통신연구실 박 원 배
상속성(Inheritance) #3 public 상속과 private 상속 public으로 private로 기반 클래스 Source5.cpp public 상속과 private 상속 기반 클래스 파생 클래스 private public으로 상속 받은 경우 private protected protected public public 외부 접근 기반 클래스 파생 클래스 private private로 상속 받은 경우 private protected protected public public 외부 접근 영상통신연구실 박 원 배
Overriding of member function 기초 클래스의 멤버 함수를 재정의 할 수 있도록 허용 기반 클래스에 이미 존재하는 함수를 파생 클래스에서 오버라이딩 하면, 파생 클래스에서는 기반 클래스의 함수가 무시되고, 파생 클래스에 새로 정의된 함수가 동작됨. Overloading 하나의 함수명에 비슷한 기능을 하면서, 넘겨 받는 인자나 리턴값이 서로 다른 여러 가지 함수를 정의 int test(int a, int b), double test(doube a, double b) ... 영상통신연구실 박 원 배
가상 함수 (Virtual Function) 파생 클래스에서 재정의(overloading)될 것으로 기대되는 멤버함수 기반 클래스에서 선언된 멤버함수 앞에 virtual 이라는 키워드를 사용 class Base { public: virtual void Show(); }; void Base :: Show() cout << “기반 클래스\n” ; } class Derived : public Base public: void Show(); void Derived :: Show() cout << “파생 클래스\n”; void main() { Base base; Derived derived; Base *ptr; ptr = &base; ptr->Show(); ptr = &derived; } Result : 기반 클래스 파생 클래스 영상통신연구실 박 원 배
this Pointer C++에서 사용하는 포인터로 어느 멤버 함수가 호출되건 간에 멤버 함수에게 전달되는 포인터이며, 호출한 객체를 가리키는 포인터이다. 멤버함수가 호출될 때 멤버 함수는 호출한 객체에 대한 this 포인터를 자동으로 전달 받는다. Class ThisPointer { public : int data; void Showthis(); }; void ThisPointer() cout << “Object address : ” << this ; } void main() { ThisPointer a,b,c ; a.Showthis(); b.Showthis(); } Result : Object address : 0x8fd50ffe Object address : 0x8fd50ffc 영상통신연구실 박 원 배
friend friend function friend class 클래스의 실제 멤버 함수가 아닌 함수를 이용하여 클래스의 비공개 멤버를 접근해야 할 필요가 있을 때 사용 friend 함수는 멤버 함수가 아닌 일반 함수로 정의 friend 함수로 사용되는 클래스의 선언부에 그 원형이 포함되어야 하며 앞에 friend 라는 키워드를 사용 friend class 하나의 클래스에서 다른 클래스를 friend로 선언하면, friend 로 선언된 클래스에서는 자기를 friend로 선언한 클래스의 어떠한 멤버에도 접근이 가능 friend 선언은 한 방향으로만 접근 가능 영상통신연구실 박 원 배
참조(Reference) 여러 가지 목적을 위해서 변수의 또 다른 이름으로 사용되는 내재된 포인터 #include <iostream.h> void func(int *n); main() { int a=0; func(&a); cout <<“Ref example ” <<a <<“\n”; return 0; } void func(int *n) *n=100; } // call by reference #include <iostream.h> void func(int &n); main() { int a=0; f(a); cout <<“Ref example ” <<a <<“\n”; return 0; } void func(int &n) n=100; } // reference parameter 영상통신연구실 박 원 배