340 likes | 578 Views
C++ 의 소개. 함수 A. 데이터. 함수 B. 함수 C. 객체기반 프로그래밍과 추상 데이터형. 절차형( procedural) 프로그래밍 공동으로 사용(접근)할 수 있는 데이터에 대해 함수들이 적용되어 어떤 처리를 하도록 하는 형태의 프로그래밍 데이터와 이를 처리하는 함수가 분리된 형태의 프로그래밍 C, Pascal, Fortran 등. 함수들. 함수들. 함수호출. 데이터. 데이터. 객 체. 객 체. 객체기반 프로그래밍과 추상 데이터형. 객체기반( object-based) 프로그래밍
E N D
함수 A 데이터 함수 B 함수 C 객체기반 프로그래밍과 추상 데이터형 • 절차형(procedural) 프로그래밍 • 공동으로 사용(접근)할 수 있는 데이터에 대해 함수들이 적용되어 어떤 처리를 하도록 하는 형태의 프로그래밍 • 데이터와 이를 처리하는 함수가 분리된 형태의 프로그래밍 • C, Pascal, Fortran 등
함수들 함수들 함수호출 데이터 데이터 객 체 객 체 객체기반 프로그래밍과 추상 데이터형 • 객체기반(object-based) 프로그래밍 • 문제를 객체단위로 분해하여 프로그래밍하는 방법 • 객체(object)는 문제의 특정 부분에 관련된 데이터와 이 데이터를 처리하는 함수들로 구성 • 일반적으로 객체지향(object-oriented) 프로그래밍 이라고 함 • C++, Java 등
객체기반 프로그래밍과 추상 데이터형 • 추상 데이터형(abstract data type) • 데이터형 = 허용되는 데이터 + 허용되는 연산(함수) 예) int • 데이터 : 정수값을 저장하는 장소 • 연산 : +, -, *, /, % • 내장 데이터형(built-in data type) • 언어 자체에서 제공하는 데이터형 • int, float, long, double, char 등 • 사용자 정의 데이터형 (user-defined data type) • 사용자가 필요에 따라 정의하는 데이터형 • C++에서는 class를 통해 사용자 정의 데이터형 제공
객체기반 프로그래밍과 추상 데이터형 • 사용자 정의 데이터형의 예제 • 정의하는 데이터형의 데이터 및 연산 • 데이터 • 월(month), 일(day), 년(year) 저장 • 연산 • 치환 : • 3개의 정수를 인자로 받는다. • 첫 번째 인자를 month에 집어넣는다. • 두 번째 인자를 day에 집어넣는다. • 세 번째 인자를 year에 집어넣는다. • Date를 반환한다. • 출력 : • Date 값을 인자로 받는다. • 월/일/년 형태로 화면에 출력한다.
객체기반 프로그래밍과 추상 데이터형 • C++에서의 주석문 • // • 이중 사선 (//) 이후의 줄 끝까지 주석으로 간주 • /* */ • C언어에서 처럼 /* */ 안의 내용을 주석으로 간주
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)과 같은 효과
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; • }
추상 데이터형(클래스) • 클래스(class) • C++ 에서는 추상 데이터형(사용자 정의 데이터형)을 class를 사용하여 정의할 수 있도록 한다. • 클래스 정의 형태 // 클래스 선언부 class 클래스-이름 { 데이터 멤버 // 변수 멤버 함수 // 내장 함수와 함수 프로토타입 }; // 클래스 구현부 함수 정의 – 멤버 함수 정의 …
추상 데이터형(클래스) • 클래스 선언의 예 // 클래스 구현부 (멤버함수 정의) 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; }
추상 데이터형(클래스) • 클래스 사용 • 정의된 클래스 이름은 int, float 등과 같은 내장 데이터형처럼 사용 Date day; /* 앞에서 정의한 클래스인 Date 형의 변수 day를 선언 */ • C++에서는 클래스형의 변수를 일반적으로 객체(object)라고 함. • 클래스 내의 변수들을 데이터 멤버라 함. • 클래스 내의 함수를 멤버 함수라 함. • 객체 지향 프로그래밍 분야에서 멤버 함수를 메소드(method) 라고 함. • 정의된 객체 내의 멤버 사용 • public 영역의 데이터 멤버 및 멤버 함수의 사용 day.month // 데이터 멤버 참조 day.showdate( ) // 멤버 함수 호출
생성자와 소멸자 • 생성자(constructor) 함수 • 클래스 이름과 같은 이름을 갖는 멤버 함수 • 객체가 만들어질 때 자동으로 호출되는 함수로서, 일반적으로 객체의 초기화 코드를 포함 • 생성자 함수는 함수의 반환형을 갖지 않는다 • 인자의 개수나 데이터형이 다르다면 여러 개의 생성자가 클래스에 정의될 수 있다. • 객체의 배열이 선언된다면 배열의 원소 개수 만큼 생성자가 호출된다. • 소멸자(destructor) 함수 • 클래스 이름과 같은 이름을 갖고 이름 앞에 (~)가 있는 멤버 함수 • 객체가 소멸될 때 자동으로 호출되는 함수 • 클래스에 단 하나의 소멸자만 정의될 수 있다. • 소멸자는 어떤 인자도 갖지 않으며, 반환형도 지정하지 않는다. • 생성자나 소멸자가 클래스 선언부 내부에서 정의되면 내장함수로 간주된다.
생성자가 있는 클래스의 예 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); }
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개 층을 이동하는 엘리베이터 #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;
응용 예 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) }
치환 • 치환(Assignment) • 동일 클래스형의 객체간의 치환은 기본적으로 항상 가능하다. • 이때 치환은 내용의 비트별(bitwise) 복사에 의해 수행된다. Date a(4, 2, 99), b; b = a; // 비트별 복사에 의한 치환
치환 • 베이스/멤버 초기화 • 생성자의 베이스/멤버 초기화 리스트를 사용하여 데이터 멤버를 초기화시킬 수 있다. Class Date { int month, day, year; public: Date(int mo = 4, int da = 1, int yr = 96) : month(mo), day(da), year(yr) { } };
추가적인 클래스 특징 • 클래스 유효 범위(scope) • 데이터 멤버와 멤버 함수 이름은 클래스 유효범위내에 지역적이다. • 전연 변수 이름이 클래스 내에서 재사용되면 전역 변수는 클래스 데이터 멤버에 의해 은닉된다. • 멤버 함수는 선언된 클래스에 지역적이고, 그 클래스로 선언된 객체에 의해서만 사용될 수 있다. • 멤버 함수의 지역변수는 동일한 이름을 갖는 클래스의 데이터 멤버를 은닉한다.
추가적인 클래스 특징 • 정적(static) 클래스 멤버 • 클래스의 모든 객체들이 공유하는 (동일한 저장공간을 갖는) 데이터 멤버 • 정적 클래스 멤버는 클래스 선언부에서 static 이란 키워드 부가하여 선언하고, 실제 기억공간을 할당하는 정의는 클래스 밖에 해야 한다. Class Employee { private: static float tax_rate; // 정적 클래스 멤버 선언 int id_num; public: Employee (int); void display( ); }; float Employee::tax_rate = 0.005; // 정적 클래스 멤버 정의
추가적인 클래스 특징 • 정적(static) 멤버 함수 • 정적 멤버 만을 접근하는 멤버 함수 • 함수 선언시에 static이란 키워드만 붙이면 정적함수가 된다. • 객체가 만들어지기 전에 호출 가능하다. Class Employee { static float tax_rate; // 정적 멤버 public: Employee(int); static void disp( ); // 정적 멤버 함수 }; void main(void) { Employee::disp( ); // 정적 함수 호출 // ... }
추가적인 클래스 특징 • 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; }
추가적인 클래스 특징 • 프렌드(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; }
연산자 함수 • 연산자(operator) 함수 • 치환 연산자를 재정의한 것 처럼 C++에서는 기존의 연산자를 재정의할 수 있다. • 재정의 될 수 있는 연산자 • ( ) (함수호출), [ ] (배열의 원소), -> (포인터), new, delete • ++, --, - (단항 음수 부호), !(논리 부정), ~(비트별 보수), * (역참조) • *, /, %, +, - (산술 연산) • <<, >> (이동(shift) 연산) • <, <=, >, >=, ==, !=, &&, || (논리 연산) • &, ^, | (비트별 연산) • =, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>= • , (쉼표) • 위에 없는 기호에 대해서는 연산자가 재정의 될 수 없다. • 새로운 연산자 기호는 생성될 수 없다. • C++ 연산자의 우선순위와 결합법칙은 바뀔 수 없다.
연산자 함수 • 연산자 함수 • 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; }
연산자 함수 • 연산자 함수 - 계속 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; }
데이터형 변환 • 내장형에서 내장형으로 변환 • 예) 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형으로 변환하는 문장
클래스 상속 • 상속(inheritance) • 어떤 기존 클래스로 부터 새로운 클래스를 파생시키는 것 • 기존 클래스 : 베이스(base) 클래스/ 부모(parent) 클래스/상위(super) 클래스 • 파생된 클래스 : 파생(derived) 클래스/자식(child) 클래스/하위(sub) 클래스 • 파생 클래스는 베이스 클래스의 모든 데이터 멤버와 멤버 함수를 포함하는 완전히 새로운 클래스이다. • 파생 클래스에는 그 클래스만의 새로운 데이터 멤버와 멤버 함수를 추가할 수 있으며, 베이스 클래스의 함수를 재정의할 수도 있다. • 두 개 이상의 베이스 클래스를 갖는, 즉 다중상속하는 파생 클래스도 정의할 수 있다. • 파생 클래스 정의 class 파생-클래스-이름: 접근명세 베이스-클래스-이름
클래스 상속 • 클래스 내에서의 접근명세(Access specification) • private(전용), public(공용), protected(보호) • private 영역내의 멤버 • 클래스 멤버 함수나 프렌드 함수에 의해서만 접근(사용) 가능 • 파생 클래스에서는 베이스 클래스의 private 영역 멤버 사용 불가 • public 영역 내의 멤버 • 클래스 멤버든 비멤버든 사용 가능 • 파생 클래스에서도 베이스 클래스의 public 영역 멤버 사용 가능 • protected 영역 내의 멤버 • 클래스 멤버 함수나 프렌드 함수에 의해서만 접근(사용) 가능 • 파생 클래스에서는 베이스 클래스의 protected 영역 멤버 사용 가능
클래스 상속 • 클래스 상속시의 접근 명세 • private • 베이스 클래스의 모든 멤버를 private 영역의 멤버로 간주 • 파생 클래스를 통해서 베이스 클래스의 public 영역 멤버의 사용도 불가 • 베이스의 private, public, protected 멤버 파생 클래스의 private 멤버 • public • 베이스 클래스의 멤버를 베이스 클래스에서의 접근명세대로 파생 클래스에 상속 • 베이스의 private 멤버 파생 클래스의 private 멤버 • 베이스의 public 멤버 파생 클래스의 public 멤버 • 베이스의 protected 멤버 파생 클래스의 protected 멤버 • protected • 베이스의 private 멤버 파생 클래스의 private 멤버 • 베이스의 public, protected 멤버 파생 클래스의 protected 멤버
클래스 상속 • 파생 클래스의 예 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( )); }
다형성(polymorphism) 베이스 클래스와 파생 클래스가 같은 이름의 함수를 가지고 있을 때, 포인터가 베이스 클래스 객체가 가리킬 때 포인터를 통해 해당 함수를 호출하면 베이스 클래스의 함수가 수행되고, 포인터가 파생 클래스 객체를 가리킬 때는 파생 클래스의 함수가 수행되도록 하는 것 포인터를 통한 동적 바인딩을 위해 이와 같이 다형성을 제공할 함수들은 가상 함수(virtual function)로 정의한다. 가상 함수는 멤버 함수 앞에 virtual 이란 키워드만 부여함으로써 가상 함수가 된다. 클래스 상속
클래스 상속 • 다형성 지원을 위한 가상 함수 사용예 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)); }