1 / 33

C++ 의 소개

C++ 의 소개. 함수 A. 데이터. 함수 B. 함수 C. 객체기반 프로그래밍과 추상 데이터형. 절차형( procedural) 프로그래밍 공동으로 사용(접근)할 수 있는 데이터에 대해 함수들이 적용되어 어떤 처리를 하도록 하는 형태의 프로그래밍 데이터와 이를 처리하는 함수가 분리된 형태의 프로그래밍 C, Pascal, Fortran 등. 함수들. 함수들. 함수호출. 데이터. 데이터. 객 체. 객 체. 객체기반 프로그래밍과 추상 데이터형. 객체기반( object-based) 프로그래밍

arch
Télécharger la présentation

C++ 의 소개

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. C++의 소개

  2. 함수 A 데이터 함수 B 함수 C 객체기반 프로그래밍과 추상 데이터형 • 절차형(procedural) 프로그래밍 • 공동으로 사용(접근)할 수 있는 데이터에 대해 함수들이 적용되어 어떤 처리를 하도록 하는 형태의 프로그래밍 • 데이터와 이를 처리하는 함수가 분리된 형태의 프로그래밍 • C, Pascal, Fortran 등

  3. 함수들 함수들 함수호출 데이터 데이터 객 체 객 체 객체기반 프로그래밍과 추상 데이터형 • 객체기반(object-based) 프로그래밍 • 문제를 객체단위로 분해하여 프로그래밍하는 방법 • 객체(object)는 문제의 특정 부분에 관련된 데이터와 이 데이터를 처리하는 함수들로 구성 • 일반적으로 객체지향(object-oriented) 프로그래밍 이라고 함 • C++, Java 등

  4. 객체기반 프로그래밍과 추상 데이터형 • 추상 데이터형(abstract data type) • 데이터형 = 허용되는 데이터 + 허용되는 연산(함수) 예) int • 데이터 : 정수값을 저장하는 장소 • 연산 : +, -, *, /, % • 내장 데이터형(built-in data type) • 언어 자체에서 제공하는 데이터형 • int, float, long, double, char 등 • 사용자 정의 데이터형 (user-defined data type) • 사용자가 필요에 따라 정의하는 데이터형 • C++에서는 class를 통해 사용자 정의 데이터형 제공

  5. 객체기반 프로그래밍과 추상 데이터형 • 사용자 정의 데이터형의 예제 • 정의하는 데이터형의 데이터 및 연산 • 데이터 • 월(month), 일(day), 년(year) 저장 • 연산 • 치환 : • 3개의 정수를 인자로 받는다. • 첫 번째 인자를 month에 집어넣는다. • 두 번째 인자를 day에 집어넣는다. • 세 번째 인자를 year에 집어넣는다. • Date를 반환한다. • 출력 : • Date 값을 인자로 받는다. • 월/일/년 형태로 화면에 출력한다.

  6. 객체기반 프로그래밍과 추상 데이터형 • C++에서의 주석문 • // • 이중 사선 (//) 이후의 줄 끝까지 주석으로 간주 • /* */ • C언어에서 처럼 /* */ 안의 내용을 주석으로 간주

  7. C++에서의 함수 • 디폴트(default) 인자 • 함수의 프로토타입에서 값이 부여되는 인자로서, 함수를 호출할 때 디폴트 인자에 대한 값이 부여되지 않으면 프로토타입에서 부여된 디폴트 인자 값이 호출되는 함수에 전달 // 디폴트 인자가 정의된 함수 void example(int, int = 5, float = 6.78); // 함수가 사용될 때 디폴트 인자의 사용 예 example(7, 2, 9.3); // 디폴트 인자 값이 사용되지 않음 example(7, 2); // example(7, 2, 6.78)과 같은 효과 example(7); // exmaple(7, 5, 6.78)과 같은 효과

  8. C++에서의 함수 • 함수 중복 (함수 이름 재사용) • C++ 에서는 인자의 개수가 다르거나 인자의 데이터형이 다르면 같은 이름의 함수를 복수개 정의할 수 있다. • 함수의 반환형만 다른 함수는 중복해서 정의할 수 없다. • 반대로 C언어는 어떤 경우에도 동일한 이름의 함수는 두 개 이상 정의될 수 없다. • void showabs(int x) • { • if (x < 0) x = -x; • cout << “The absolute value of the integer is “ << x << endl; • } • void showabs(long x) • { • if (x < 0) x = -x; • cout << “The absolute value of the long integer is “ << x << endl; • }

  9. 추상 데이터형(클래스) • 클래스(class) • C++ 에서는 추상 데이터형(사용자 정의 데이터형)을 class를 사용하여 정의할 수 있도록 한다. • 클래스 정의 형태 // 클래스 선언부 class 클래스-이름 { 데이터 멤버 // 변수 멤버 함수 // 내장 함수와 함수 프로토타입 }; // 클래스 구현부 함수 정의 – 멤버 함수 정의 …

  10. 추상 데이터형(클래스) • 클래스 선언의 예 // 클래스 구현부 (멤버함수 정의) Date::Date(int mm = 7, int dd = 4, int yy = 99) // 생성자 { month = mm; day = dd; year = yy; } void Date::setdate(int mm, int dd, int yy) { month = mm; day = dd; year = yy; } void Date::showdate(void) { cout << "The date is " << month << "/" << day << "/" << year << endl; }

  11. 추상 데이터형(클래스) • 클래스 사용 • 정의된 클래스 이름은 int, float 등과 같은 내장 데이터형처럼 사용 Date day; /* 앞에서 정의한 클래스인 Date 형의 변수 day를 선언 */ • C++에서는 클래스형의 변수를 일반적으로 객체(object)라고 함. • 클래스 내의 변수들을 데이터 멤버라 함. • 클래스 내의 함수를 멤버 함수라 함. • 객체 지향 프로그래밍 분야에서 멤버 함수를 메소드(method) 라고 함. • 정의된 객체 내의 멤버 사용 • public 영역의 데이터 멤버 및 멤버 함수의 사용 day.month // 데이터 멤버 참조 day.showdate( ) // 멤버 함수 호출

  12. 생성자와 소멸자 • 생성자(constructor) 함수 • 클래스 이름과 같은 이름을 갖는 멤버 함수 • 객체가 만들어질 때 자동으로 호출되는 함수로서, 일반적으로 객체의 초기화 코드를 포함 • 생성자 함수는 함수의 반환형을 갖지 않는다 • 인자의 개수나 데이터형이 다르다면 여러 개의 생성자가 클래스에 정의될 수 있다. • 객체의 배열이 선언된다면 배열의 원소 개수 만큼 생성자가 호출된다. • 소멸자(destructor) 함수 • 클래스 이름과 같은 이름을 갖고 이름 앞에 (~)가 있는 멤버 함수 • 객체가 소멸될 때 자동으로 호출되는 함수 • 클래스에 단 하나의 소멸자만 정의될 수 있다. • 소멸자는 어떤 인자도 갖지 않으며, 반환형도 지정하지 않는다. • 생성자나 소멸자가 클래스 선언부 내부에서 정의되면 내장함수로 간주된다.

  13. 생성자가 있는 클래스의 예 class Date { private : int month, day, year; // 데이터 멤버 public : Date(int, int, int); // 생성자 Date(long); // 생성자 ~Date( ); // 소멸자 void showdate(void); }; 생성자와 소멸자 Data::Date(int mm=7, int dd=4, int yy = 94) { month = mm; day = dd; yy = year; } Date::Date(long yymmdd) { year = int (yymmdd/10000.0); month = int ((yymmdd -year*1000.0)/100.00); day = int((yymmdd - year*1000.0- month*100.0); }

  14. Date::~Date( ) // 소멸자 { cout << “Destructor is called\n”; } void Date::showdate(void) { cout << “The date is “ << month << “/” << day << “/” << year << endl; } void main(void) { Date a; // 생성자 Date(int, int, int) 호출 Date b(4, 1, 96); // 생성자 Date(int, int, int) 호출 Date c(970515); // 생성자 Date(long) 호출 a.showdate( ); b.showdate( ); c.showdate( ); // a, b, c에 대한 소멸자 호출 } 생성자와 소멸자

  15. 응용 예 • 15개 층을 이동하는 엘리베이터 #include <iostream.h> const int MAXFLOOR = 15 class Elevator { private : int cur_floor; // 엘리베이터의 현재 위치 public: Elevator(int); void request(int); }; Elevator::Elevator(int cfloor = 1) { cur_floor = cfloor; } void Elevator::request(int newfloor) { if (newfloor < 1 || newfloor > MAXFLOOR || newfloor == cur_floor) ; // do nothing else if (newfloor > cur_floor) { cout << “\nStarting at floor “ << cur_floor << endl;

  16. 응용 예 while (newfloor > cur_floor) { cur_floor ++; cout << “Going up - now at floor “ << cur_floor << end; } cout << “Stopping at floor << cur_floor << endln; } else { cout << “\nStarting at floor “ << cur_floor << endl; while (newfloor > cur_floor) { cur_floor --; cout << “Going down - now at floor “ << cur_floor << end; } cout << “Stopping at floor << cur_floor << endln; } } void main(void) { Elevator a; a.request(6); a.request(3) }

  17. 치환 • 치환(Assignment) • 동일 클래스형의 객체간의 치환은 기본적으로 항상 가능하다. • 이때 치환은 내용의 비트별(bitwise) 복사에 의해 수행된다. Date a(4, 2, 99), b; b = a; // 비트별 복사에 의한 치환

  18. 치환 • 베이스/멤버 초기화 • 생성자의 베이스/멤버 초기화 리스트를 사용하여 데이터 멤버를 초기화시킬 수 있다. Class Date { int month, day, year; public: Date(int mo = 4, int da = 1, int yr = 96) : month(mo), day(da), year(yr) { } };

  19. 추가적인 클래스 특징 • 클래스 유효 범위(scope) • 데이터 멤버와 멤버 함수 이름은 클래스 유효범위내에 지역적이다. • 전연 변수 이름이 클래스 내에서 재사용되면 전역 변수는 클래스 데이터 멤버에 의해 은닉된다. • 멤버 함수는 선언된 클래스에 지역적이고, 그 클래스로 선언된 객체에 의해서만 사용될 수 있다. • 멤버 함수의 지역변수는 동일한 이름을 갖는 클래스의 데이터 멤버를 은닉한다.

  20. 추가적인 클래스 특징 • 정적(static) 클래스 멤버 • 클래스의 모든 객체들이 공유하는 (동일한 저장공간을 갖는) 데이터 멤버 • 정적 클래스 멤버는 클래스 선언부에서 static 이란 키워드 부가하여 선언하고, 실제 기억공간을 할당하는 정의는 클래스 밖에 해야 한다. Class Employee { private: static float tax_rate; // 정적 클래스 멤버 선언 int id_num; public: Employee (int); void display( ); }; float Employee::tax_rate = 0.005; // 정적 클래스 멤버 정의

  21. 추가적인 클래스 특징 • 정적(static) 멤버 함수 • 정적 멤버 만을 접근하는 멤버 함수 • 함수 선언시에 static이란 키워드만 붙이면 정적함수가 된다. • 객체가 만들어지기 전에 호출 가능하다. Class Employee { static float tax_rate; // 정적 멤버 public: Employee(int); static void disp( ); // 정적 멤버 함수 }; void main(void) { Employee::disp( ); // 정적 함수 호출 // ... }

  22. 추가적인 클래스 특징 • this포인터 • 멤버 함수를 호출한 객체를 가리키는 포인터 • 멤버 함수가 호출될때 자동으로 해당 멤버 함수에 숨겨진 인자로 전달됨 Date::Date(int mm = 7, int dd = 4, int yy = 94) { month = mm; day = dd; year = yy; } this 포인터를 명시적으로 사용한 멤버함수 Date::Date(int mm = 7, int dd = 4, int yy = 94) { this->month = mm; this-> day = dd; this-> year = yy; }

  23. 추가적인 클래스 특징 • 프렌드(friend) 함수 • 클래스의 멤버 함수가 아닌 것 중에서 멤버 함수와 동일한 데이터 멤버 및 멤버 함수에 대한 사용(접근) 권한을 갖는 함수 • 프렌드 함수의 정의 class Date { int month, day, year; public: Data(int, int, int); void showdate( ); friend int get_month(Data a); // 프렌드 함수 선언 }; int get_month(Data a) // 프렌드 함수로 사용되는 일반 함수 { return a.month; }

  24. 연산자 함수 • 연산자(operator) 함수 • 치환 연산자를 재정의한 것 처럼 C++에서는 기존의 연산자를 재정의할 수 있다. • 재정의 될 수 있는 연산자 • ( ) (함수호출), [ ] (배열의 원소), -> (포인터), new, delete • ++, --, - (단항 음수 부호), !(논리 부정), ~(비트별 보수), * (역참조) • *, /, %, +, - (산술 연산) • <<, >> (이동(shift) 연산) • <, <=, >, >=, ==, !=, &&, || (논리 연산) • &, ^, | (비트별 연산) • =, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>= • , (쉼표) • 위에 없는 기호에 대해서는 연산자가 재정의 될 수 없다. • 새로운 연산자 기호는 생성될 수 없다. • C++ 연산자의 우선순위와 결합법칙은 바뀔 수 없다.

  25. 연산자 함수 • 연산자 함수 • C++의 내장 데이터형에 대해서는 연산자가 재정의될 수 없다. • 단항 연산자가 이항 연산자로 재정의될 수도 없고, 이항 연산자가 단항 연산자로 재정의될 수 없다. • 연산자 함수는 클래스의 멤버이거나, 적어도 하나 이상의 클래스를 가져야 한다. • 연산자 함수는 멤버 함수나 프렌드 함수로 정의된다. Class Date { int month, day, year; public: Date(int, int, int); Date operator+(int); // + 연산자 중복 void showdate(void); }; Date::Date(int mm = 0, int dd = 0; int yy = 0) { month = mm; day = dd; yy = year; } Date Date::operator+(int days) { Date temp; temp.day = day+days; temp.year = year; temp.month = month; while (temp.day > 30) { temp.month++; temp.day-= 30; } while (temp.month > 12) { temp.year ++; temp.month -= 12; } return temp; }

  26. 연산자 함수 • 연산자 함수 - 계속 void Date::showdata(void) { cout << month << “/” << day << “/” << year; } void main(void) { Date a(4,1, 99), b; cout << “The initial data is “; a.showdate( ); b = a + 284; // b = a.operator+(284); 연산자 함수 호출 cout << “\nnew data is “; b.showdate; }

  27. 데이터형 변환 • 내장형에서 내장형으로 변환 • 예) int val = (int) 14.3; float val2 = float(143); • 내장형에서 사용자 정의 데이터형 (클래스)로의 변환 • 형변환(type conversion) 생성자 사용 Date::Date(long findate) // long형을 Date형으로 변환하는 생성자 { year = int (findate/10000.0); month = int ((findate - year*10000.0)/100.0); } Date a; a = Date(991225); // long형 값을 Date형으로 변환하는 문장

  28. 클래스 상속 • 상속(inheritance) • 어떤 기존 클래스로 부터 새로운 클래스를 파생시키는 것 • 기존 클래스 : 베이스(base) 클래스/ 부모(parent) 클래스/상위(super) 클래스 • 파생된 클래스 : 파생(derived) 클래스/자식(child) 클래스/하위(sub) 클래스 • 파생 클래스는 베이스 클래스의 모든 데이터 멤버와 멤버 함수를 포함하는 완전히 새로운 클래스이다. • 파생 클래스에는 그 클래스만의 새로운 데이터 멤버와 멤버 함수를 추가할 수 있으며, 베이스 클래스의 함수를 재정의할 수도 있다. • 두 개 이상의 베이스 클래스를 갖는, 즉 다중상속하는 파생 클래스도 정의할 수 있다. • 파생 클래스 정의 class 파생-클래스-이름: 접근명세 베이스-클래스-이름

  29. 클래스 상속 • 클래스 내에서의 접근명세(Access specification) • private(전용), public(공용), protected(보호) • private 영역내의 멤버 • 클래스 멤버 함수나 프렌드 함수에 의해서만 접근(사용) 가능 • 파생 클래스에서는 베이스 클래스의 private 영역 멤버 사용 불가 • public 영역 내의 멤버 • 클래스 멤버든 비멤버든 사용 가능 • 파생 클래스에서도 베이스 클래스의 public 영역 멤버 사용 가능 • protected 영역 내의 멤버 • 클래스 멤버 함수나 프렌드 함수에 의해서만 접근(사용) 가능 • 파생 클래스에서는 베이스 클래스의 protected 영역 멤버 사용 가능

  30. 클래스 상속 • 클래스 상속시의 접근 명세 • private • 베이스 클래스의 모든 멤버를 private 영역의 멤버로 간주 • 파생 클래스를 통해서 베이스 클래스의 public 영역 멤버의 사용도 불가 • 베이스의 private, public, protected 멤버  파생 클래스의 private 멤버 • public • 베이스 클래스의 멤버를 베이스 클래스에서의 접근명세대로 파생 클래스에 상속 • 베이스의 private 멤버  파생 클래스의 private 멤버 • 베이스의 public 멤버  파생 클래스의 public 멤버 • 베이스의 protected 멤버  파생 클래스의 protected 멤버 • protected • 베이스의 private 멤버  파생 클래스의 private 멤버 • 베이스의 public, protected 멤버  파생 클래스의 protected 멤버

  31. 클래스 상속 • 파생 클래스의 예 Class Circle // 베이스 클래스 { protected: double radius; public: Circle (double r = 1.0) { radius = r; } double calval(void) { return (pi*radius*radius); } }; Class Cylinder : public Circle // 파생 클래스 { protected: double length; public: Cylinder(double r = 1.0, double l = 1.0): Circle(r), length(1) { } double calval (void) ; // 함수 재정의 }; double Cylinder::calval(void) { return (length*Circle::calval( )); }

  32. 다형성(polymorphism) 베이스 클래스와 파생 클래스가 같은 이름의 함수를 가지고 있을 때, 포인터가 베이스 클래스 객체가 가리킬 때 포인터를 통해 해당 함수를 호출하면 베이스 클래스의 함수가 수행되고, 포인터가 파생 클래스 객체를 가리킬 때는 파생 클래스의 함수가 수행되도록 하는 것 포인터를 통한 동적 바인딩을 위해 이와 같이 다형성을 제공할 함수들은 가상 함수(virtual function)로 정의한다. 가상 함수는 멤버 함수 앞에 virtual 이란 키워드만 부여함으로써 가상 함수가 된다. 클래스 상속

  33. 클래스 상속 • 다형성 지원을 위한 가상 함수 사용예 class Two: public One { public : virtual float f1(float); }; float Two::f1(float num) { return (num/3); } void main(void) { One object_1; Two object_2; One *ptr; ptr = &object_1; cout << “object_1” << ptr->f1(12) << endl; ptr = &object_2; cout << “object_2” << ptr->f1(12 ) << endl; } class One { protected: float a; public : One(float); virtual float f1(float); float f2(float); }; One::One(float val = 2) { a = val; } float One::f1(float num) { return (num/2); } float One::f2(float num) { return (pow(f1(num),2)); }

More Related