클 래 스 의 클 래 스 의 클 래 스 의 클 래 스 의 개 념 개 념 개 념 개 념 클래스는 함수와 변수를 모아서 관리하는 집합체다
이 장에서 다룰 내용 클래스와 인스턴스 1 생성자와 소멸자 2 클래스의 상속 3 객체 포인터 4
01_ 클래스와 인스턴스 중 요 한 중 요 한 중 요 한 중 요 한 요 소 요 소 요 소 요 소
클래스 (c la s s ) 중 요 한 중 요 한 중 요 한 중 요 한 요 소 요 소 요 소 요 소
C++라는언어를 배우는데있어서 그중심이되는 매우중요한요소집합체집합체집합체집합체 같은목적을가진 함수와이함수들이 사용하는변수들을 한곳에모아서 관리하는일종의 집합체
01_ 클래스와 인스턴스 클래스의 구성요소 멤버 메소드 (함수 )와 멤버 변수 (변수 ) 클래스의 기본형태와 사용 예
Class 클래스명Class FishClass 클래스명 { 접근제한자: 멤버_메소드들 ….. 접근제한자 멤버_변수들 ….. } [기본형태]Class Fish { public: void Swim() { printf("You invoke swim()\n"); }; }; [사용예]
01_ 클래스와 인스턴스 클래스명의 올바른 작성 예
•클래스명은클래스명은클래스명은클래스명은C++C++C++C++에서에서에서에서키워드로키워드로키워드로키워드로사용하고사용하고사용하고사용하고있는있는있는있는단어단어단어단어((((예약어예약어예약어예약어))))가가가가 아니라면아니라면아니라면아니라면그리고그리고그리고그리고이미이미이미이미사용한사용한사용한사용한이름만이름만이름만이름만아니라면아니라면아니라면아니라면다음과다음과다음과다음과같이같이같이같이어떤어떤어떤어떤 이름을이름을이름을이름을붙여도붙여도붙여도붙여도상관상관상관상관없다없다없다없다.... 클래스명클래스명클래스명클래스명사용사용사용사용예예예예적용적용적용적용이유이유이유이유클래스명클래스명클래스명클래스명사용사용사용사용예예예예적용적용적용적용이유이유이유이유 Aclass A {…};○사용에아무런문제가없다. Youclass You {…};○사용에아무런문제가없다. classclass clas {…};○키워드와이름이동일하다. publicclass public {…};×public이라는접근제한자와이름이동일하다. newclass new {…};×new은C++에서사용하는예약어다.01_ 클래스와 인스턴스 클래스와 인스턴스의 비유 클래스클래스클래스클래스 1 0 원짜리를 찍어내는 형틀 1 0 원짜리를 찍어내는 형틀 인스턴스인스턴스인스턴스인스턴스 형틀에서 찍어낸 1 0 원짜리 동전 형틀에서 찍어낸 1 0 원짜리 동전
클래스 인스턴스[기본예제 6- 1] 클래스 생성과 사용
01 #include <cstdio> 02 using namespace std; 03 class Fish03 class Fish03 class Fish03 class Fish 04 { 05 public: 06 void Swim()06 void Swim()06 void Swim()06 void Swim() 07 { 08 printf("You invoke swim()\n");FishFishFishFish라는라는라는라는클래스를클래스를클래스를클래스를선언하고선언하고선언하고선언하고사용한다사용한다사용한다사용한다.... FishFishFishFish라는라는라는라는클래스의클래스의클래스의클래스의멤버멤버멤버멤버메소드다메소드다메소드다메소드다.... 08 printf("You invoke swim()\n"); 09 }; 10 }; 11 12 intmain() 13 { 14 Fish14 Fish14 Fish14 Fish fishfishfishfish;;;; 15 fish.Swim(); 16 }
위에서위에서위에서위에서선언한선언한선언한선언한FishFishFishFish라는라는라는라는클래스에서클래스에서클래스에서클래스에서 fishfishfishfish라는라는라는라는인스턴스를인스턴스를인스턴스를인스턴스를생성한다생성한다생성한다생성한다....
01_ 클래스와 인스턴스 접근제한자
•멤버멤버멤버멤버변수변수변수변수또는또는또는또는멤버멤버멤버멤버메소드를메소드를메소드를메소드를정의하기정의하기정의하기정의하기전에전에전에전에이러한이러한이러한이러한멤버들을멤버들을멤버들을멤버들을 사용하는사용하는사용하는사용하는데데데데있어있어있어있어그그그그권한을권한을권한을권한을제한하는제한하는제한하는제한하는접근제한자를접근제한자를접근제한자를접근제한자를사용해줘야사용해줘야사용해줘야사용해줘야 한다한다한다한다....접근제한자의 종류 접근제한자의 종류
접근접근접근접근제한자제한자제한자제한자접근접근접근접근권한권한권한권한 private동일한클래스내의메소드 public동일한클래스내의메소드와모든다른외부클래스또는외부 클래스 protected동일한클래스내의메소드와그클래스로부터상속받은클래스[응용예제 6- 2] 접근제한자의 생략
01 class Quadrangle 02 { 03 [ 03 [ 03 [ 03 [ ①①①①]]]] 04 intwidth; 05 intheight; 06 intarea; 07 08 public :private:private:private:private: 08 public : 09 intCalcuateArea( intargWidth, intargHeight) 10 { 11 width = argWidth; 12 height = argHeight; 13 area = width * height; 14 return area; 15 }; 16 };
[응용예제 6- 3] 선언부와 구현부를 분리한 클래스
01 class Quadrangle 02 { 03 [ 03 [ 03 [ 03 [ ①①①①]]]] 04 int width; 05 int height; 06 int area; 07 08 [ 08 [ 08 [ 08 [ ②②②②]]]] 09 int CalcuateArea ( int argWidth, int argHeight);private:private:private:private: 메소드의메소드의메소드의메소드의선언부선언부선언부선언부 public :public :public :public : 09 int CalcuateArea ( int argWidth, int argHeight); 10 }; 11 12 Int Quadrangle::CalcuateArea ( int argWidth, int argHeight) 13 { 14 width = argWidth; 15 height = argHeight; 16 area = width * height; 17 return area; 18 };
메소드의메소드의메소드의메소드의구현부구현부구현부구현부
[응용예제 6 - 5 ] 원의 넓이를 구하는 클래스 작성 ③
01 class [ ①] 02 { 03 [ ②] : 04 intradius; 05 06 [ ③] : 07 float [ ④] () 08 { 09 float area = 0;CircleCircleCircleCircle privateprivateprivateprivate publicpublicpublicpublic caculateAreacaculateAreacaculateAreacaculateArea 반지름을반지름을반지름을반지름을구하기구하기구하기구하기위한위한위한위한09 float area = 0; 10 area = radius * radius * 3.14; 11 return area; 12 }; 13 14 void [ ⑤] ( intargRadius) 15 { 16 radius = argRadius; 17 }; 18 19 };
SetRadiusSetRadiusSetRadiusSetRadius
반지름을반지름을반지름을반지름을구하기구하기구하기구하기위한위한위한위한 멤버멤버멤버멤버함수함수함수함수 원의원의원의원의넓이를넓이를넓이를넓이를구하기구하기구하기구하기 위한위한위한위한멤버멤버멤버멤버함수함수함수함수
[응용예제 6 - 7 ] 원의 넓이를 구하는 m a in 함수 작성 0 1 vo id [ ① ] () 0 2 { 0 3 in t ra d iu s = 0 ; 0 4 C ir c le c ir c le ; 0 5 0 6 p ri n tf (" 반지름을 입력하세요 (c m )\ n ") ; 0 7 s c a n f( "% d ", & ra d iu s );
CircleCircleCircleCircle
0 7 s c a n f( "% d ", & ra d iu s ); 0 8 0 9 c ir c le .S e tR a d iu s (r a d iu s ); 1 0 p ri n tf (" 반지름이 % d c m 인 원의 넓이 = % 0 .3 f c m ^ 2 \ n ", ra d iu s , c ir c le .C a c u la te A re a () ); 1 1 }
[기본예제 6- 8] 원의 넓이를 구하는 프로그램
01 #include<iostream> 02 using namespace std; 03 class Unit { 04 05 intstatus; 06 07 public: 08 Unit(); 09 ~Unit();09 ~Unit(); 10 void fly(); 11 }; 12 13 Unit::Unit() 14 { 15 16 cout<< "Unit constructor \n"; 17 status = 1; 18 }[기본예제 6- 8] 원의 넓이를 구하는 프로그램
19 20 Unit::~Unit() 21 { 22 cout << "Unit destructing...\n"; 23 status = 0; 24 } 25 26 void Unit::fly() 27 {27 { 28 cout << status << "\n"; 29 } 30 31 int main(int argc, char* argv[]) 32 { 33 Unit oUnit; 34 oUnit.fly(); 35 return 0; 36 }02_ 생성자와 소멸자 생성자와 소멸자의 개념 생성자생성자생성자생성자 클래스의 객체 (인스턴스 )가 생성될 때마다 호출되며 , 객체를 생성할 때 생성자 함수를 통하여 객체 생성에 필요한 어떠한 초기화도 자동으로 수행할 수 있다 .
클래스의 객체 (인스턴스 )가 생성될 때마다 호출되며 , 객체를 생성할 때 생성자 함수를 통하여 객체 생성에 필요한 어떠한 초기화도 자동으로 수행할 수 있다 . 소멸자소멸자소멸자소멸자 컴퓨터는 무한의 자원을 가진 것이 아니다 . 따라서 한 번 사용한 자원은 다시 다른 프로 그램이 사용할 수 있도록 돌려줘야 하는데 , 이러한 역할을 하는 것이 소멸자다 .
컴퓨터는 무한의 자원을 가진 것이 아니다 . 따라서 한 번 사용한 자원은 다시 다른 프로 그램이 사용할 수 있도록 돌려줘야 하는데 , 이러한 역할을 하는 것이 소멸자다 .
02_ 생성자와 소멸자 생성자와 소멸자의 기본 형태와 사용 예
Class 클래스명 { public: 클래스명(); ~클래스명(); };Class ExampleClass { public: ExampleClass(){}; ~ExampleClas(){}; };
생성자는 그 생성자가 속하는 클래스의 이름과 동일한 이름을 가져야 한다 . 소멸자는 생성자의 가장 앞에 ~ 를 추가해주면 된다 . 다른 메소드들은 반환형 (r e tu rn - ty p e )를 앞에 명시해줘야 하지만 생성자와 소멸자는 반환형을 가지지 않는다 . 이런 특징으로 인해서 생성자와 소멸자는 다른 메소드와 확연히 구분된다 .
[기본형태][사용예]
[기본예제 6- 9] 생성자와 소멸자의 예 ①
01 #include<iostream> 02 using namespace std; 03 class Unit { 04 05 intstatus; 06 07 public: 08 Unit(); 08 Unit(); 08 Unit(); 08 Unit(); 09 ~Unit();09 ~Unit();09 ~Unit();09 ~Unit();생성자생성자생성자생성자 09 ~Unit();09 ~Unit();09 ~Unit();09 ~Unit(); 10 void fly(); 11 }; 12 13 Unit::Unit() 14 { 15 16 cout<< "Unit constructor \n"; 17 status = 1; 18 }
소멸자소멸자소멸자소멸자
[기본예제 6 - 1 0 ] 매개변수를 가지는 생성자와 소멸자 ②
19 20 Unit::~Unit() 21 { 22 cout << "Unit destructing...\n"; 23 status = 0; 24 } 25 26 void Unit::fly() 27 {27 { 28 cout << status << "\n"; 29 } 30 31 int main(int argc, char* argv[]) 32 { 33 Unit oUnit; 34 oUnit.fly(); 35 return 0; 36 }[기본예제 6 - 1 0 ] 매개변수를 가지는 생성자와 소멸자 ②
01 #include<iostream> 02 using namespace std; 03 class Unit { 04 intstatus; 05 public: 06 Unit(inta); 07 ~Unit(); 08 void fly(); 09 };09 }; 10 11 Unit::Unit(inta) 12 { 13 cout<< "Unit constructor \n"; 14 status = a; 15 } 16 17 Unit::~Unit() 18 {[기본예제 6 - 1 0 ] 매개변수를 가지는 생성자와 소멸자 ③
19 cout << "Unit Destructing...\n"; 20 status = 0; 21 } 22 void Unit::fly() 23 { 24 cout << status << "\n"; 25 } 26 27 int main(int argc, char* argv[]) 28 {28 { 29 Unit oUnit(10); 30 oUnit.fly(); 31 return 0; 32 }03_ 클래스의 상속 상속의 개념 ‘재산상속 ’과 같이 부모가 자식에게 물질적 혹은 정신적인 무엇인가를 물려주는 것을 ‘상속 ’이라고 하는 것처럼 C + + 에서도 클래스 사이에서 무엇인가를 물려주고 물려받는 것을 클래스의 상속이라고 한다 . 상속의 예 상속의 예
01 class NPC { 02 03 int defense; 04 05 public: 06 void SetDefense(int n); 07 08 int GetDefense(); 09 }; [부모클래스][자식클래스]01 class Grunt : public NPC { 02 int Armor; 03 public: 04 void SetArmor(int n); 05 int GetArmoredDefense(); 06 };
[기본예제 6- 11] 클래스의 상속
01 #include<iostream> 02 using namespace std; 03 class NPC { 04 05 intdefense; 06 07 public: 08 void SetDefense(intn); 09 intGetDefense();09 intGetDefense(); 10 }; 11 12 13 class Grunt : public NPC { 14 15 intarmor; 16 17 public: 18 void SetArmor(intn);[기본예제 6- 11] 클래스의 상속
19 int GetArmoredDefense(); 20 }; 21 22 void NPC::SetDefense(int n) 23 { 24 defense = n; 25 } 26 27 int NPC::GetDefense()27 int NPC::GetDefense() 28 { 29 return defense; 30 } 31 32 void Grunt::SetArmor(int n) 33 { 34 armor = n; 35 } 36[기본예제 6- 11] 클래스의 상속
37 intGrunt::GetArmoredDefense() 38 { 39 return armor+GetDefense(); 40 } 41 42 intmain(intargc, char* argv[]) 43 { 44 Grunt oUnit;44 Grunt oUnit; 45 oUnit.SetDefense(10); 46 oUnit.SetArmor(20); 47 48 cout<< "Get Armored Defense : " << oUnit.GetArmoredDefense() << "\n"; 49 return 0; 50 }03_ 클래스의 상속 [기본예제 6- 11] 의 클래스 구성
03_ 클래스의 상속 04_ 객체포인터 다중상속다중상속 단지 하나의 부모 클래스로부터만 가능한 것 이 아니라 여러 부모 클래스로부터도 상속받 는 것을 일컫어 다중상속이라고 한다 .
다중상속과 객체 포인터의 의미 객체포인터객체포인터객체포인터객체포인터 객체를 가리키는 포인터로 객체의 멤버에 접근할 때에는 화살표 연산자를 사용한다 . 이는 다른 형의 포인터 변수를 선언하는 것 과 같은 방법으로 객체 포인터를 선언한다 는 의미다 .
객체를 가리키는 포인터로 객체의 멤버에 접근할 때에는 화살표 연산자를 사용한다 . 이는 다른 형의 포인터 변수를 선언하는 것 과 같은 방법으로 객체 포인터를 선언한다 는 의미다 .
예제모음 _10 의 요구사항 및 실행결과 요 구 사 항 요 구 사 항 요 구 사 항 요 구 사 항
①삼각형의넓이를계산할수있는클래스를설계, 작성한다. ②반드시생성자가존재해야한다. ③설계한클래스를사용할main() 함수를작성한다. ④클래스를사용할때객체포인터를이용한다. ⑤cin을이용하여, 가로, 세로의길이를입력받는다.실 행 결 과 실 행 결 과 실 행 결 과 실 행 결 과
예제모음 _10 소스
01 #include <iostream> 02 using namespace std; 03 class TriangleArea 04 { 05 private: 06 intwidth; 07 intheight; 08 09 public:학생학생학생학생정보를정보를정보를정보를위한위한위한위한클래스다클래스다클래스다클래스다.... 09 public: 10 TriangleArea(intargWidth, intargHeight); 11 float Calculate(); 12 }; 13 14 TriangleArea::TriangleArea(intargWidth, intargHeight) 15 { 16 width = argWidth; 17 height = argHeight; 18 }
예제모음 _10 소스
19 20 float TriangleArea::Calculate() 21 { 22 float area = 0 ; 23 24 area = width * height; 25 area = area / 2.0; 26 27 return area;학생들의학생들의학생들의학생들의성적의성적의성적의성적의합만합만합만합만구해주는구해주는구해주는구해주는클래스다클래스다클래스다클래스다.... 27 return area; 28 } 29 30 31 void main() 32 { 33 int width = 0, height = 0; 34 35 cout << "가로길이를입력하세요. : "; 36 cin >> width;
예제모음 _10 소스
37 cout<< "세로길이를입력하세요. : "; 38 cin>> height; 39 40 TriangleArea* triArea= new TriangleArea(width, height); 41 cout<< "삼각형의넓이는" << triArea->Calculate() << " 제곱센티미터입니다." << endl; 42 } 포인터를포인터를포인터를포인터를이용해서이용해서이용해서이용해서넓이를넓이를넓이를넓이를계산한다계산한다계산한다계산한다....예제모음 _11 의 요구사항 및 실행결과 요 구 사 항 요 구 사 항 요 구 사 항 요 구 사 항
①현재학생들의성적을넣어주면그총합을구해주는클래스가있다. ②아래와같은실행결과가나오도록평균을구하는기능을추구한다. ③Student, Calculator 클래스의코드를고치지않고, 클래스를추가, 상속하여2번의요구사항을만족시킨다. ④학생들의데이터는총네명이고, 데이터는아래와같다. 1번: 30점, 2번: 90점, 3번: 100점, 4번: 50점실 행 결 과 실 행 결 과 실 행 결 과 실 행 결 과
예제모음 _11 소스
01 class Student 02 { 03 public: 04 Student() 05 { 06 number = 0; 07 grade = 0; 08 }; 09 Student(intargNumber, intargGrade):09 Student(intargNumber, intargGrade): number(argNumber), grade(argGrade) { }; 10 ~Student(){}; 11 12 intGetNumber() { return number; }; 13 intGetGrade() { return grade; }; 14 15 private: 16 intnumber; 17 intgrade; 18 };예제모음 _11 소스
19 20 class Calculator 21 { 22 public: 23 Calculator() 24 { 25 numberOfStudent = 0; 26 }; 27 void AddStudent(Student argStudent);27 void AddStudent(Student argStudent); 28 int Sum(); 29 30 private: 31 Student student[50]; 32 33 protected: 34 int numberOfStudent; 35 }; 36예제모음 _11 소스
37 void Calculator::AddStudent(Student argStudent) 38 { 39 student[numberOfStudent++] = argStudent; 40 }; 41 42 int Calculator::Sum() 43 { 44 int sum = 0; 45 for (int i = 0; i < numberOfStudent; i++) 46 sum += student[i].GetGrade(); 47 48 return sum; 49 };예제모음 _11 추가한 소스
01 class CalculatorEx : public Calculator 02 { 03 public: 04 CalculatorEx(){}; 05 float Average() 06 { 07 float average = 0.0; 08 average = Sum() / (float)numberOfStudent; 09 return average;CalculatorCalculatorCalculatorCalculator클래스를클래스를클래스를클래스를상속한다상속한다상속한다상속한다.... 평균을평균을평균을평균을구해주는구해주는구해주는구해주는함수를함수를함수를함수를추가한다추가한다추가한다추가한다.... 09 return average; 10 }; 11 }; 12 13 void main() 14 { 15 Student student1(1, 30); 16 Student student2(2, 90); 17 Student student3(3, 100); 18 Student student4(4, 50);
학생들의학생들의학생들의학생들의자료를자료를자료를자료를생성한다생성한다생성한다생성한다....
예제모음 _11 추가한 소스
19 20 CalculatorEx cal; 21 cal.AddStudent(student1); 22 cal.AddStudent(student2); 23 cal.AddStudent(student3); 24 cal.AddStudent(student4); 25학생들의학생들의학생들의학생들의자료를자료를자료를자료를입력한다입력한다입력한다입력한다.... 26 cout << "학생들의성적합계: " << cal.Sum() << endl; 27 cout << "학생들의성적합계: " << cal.Average() << endl; 28 } 성적의성적의성적의성적의총합과총합과총합과총합과평균을평균을평균을평균을구한다구한다구한다구한다....