지금까지 설명한 C++의 구조체는 클래스의 일종이다.
그렇다면 클래스와 구조체에는 어떠한 차이점이 있을까?
클래스와 구조체의 유일한 차이점
키워드 struct를 대신해서 class를 사용하면, 구조체가 아닌 클래스가 된다. 아래의 예제를 살펴보자.
class Car
{
char gamerID [ Car_CONST :: ID_LEN ] ;
int fuelGauge ;
int curSpeed ;
void ShowCarState( ) { . . . . }
void Accel( ) { . . . . }
void Break( ) { . . . . }
} ;
위 처럼 클래스를 사용할 경우 다음의 방식으로 변수를 선언할 수 없다.
Car run99 = { "run99" , 100, 0 } ; ( x )
그 이유는 클래스 내에 선언된 함수가 아닌, 다른 영역에서 변수를 초기화 하려 했기 때문이다.
클래스는 기본적으로 클래스 내에 선언된 변수는 클래스 내에 선언된 함수에서만 접근이 가능하다.
따라서 다음과 같은 형태로 클래스 변수를 선언해야 한다.
Car run99 ;
클래스를 정의하는 과정에서 각각 변수 및 함수의 접근 허용범위를 별도로 선언해야 한다.
그리고 바로 이것이 키워드 struct 를 이용해서 정의하는 구조체와
키워드 class를 이용해서 정의하는 클래스의 유일한 차이점이다.
접근제어 지시자(접근제어 레이블)
C++의 접근제어 지시자는 다음과 같이 총 세가지가 존재한다.
- public : 어디서든 접근 허용
- protected : 상속관계에 놓여있을 때, 유도 클래스에서의 접근 허용
- private : : 클래스 내(클래스 내에 정의된 함수)에서만 접근 허용
이중 protected는 '상속' 과 관련이 있으므로 나중에 살펴보도록 하자.
먼저 public과 private에 대해서 예제를 통해 알아보자.
- #include <iostream>
- #include <cstring>
- using namespace std;
- namespace CAR_CONST
- {
- enum
- {
- ID_LEN = 20, MAX_SPD = 200, FUEL_STEP = 2,
- ACC_STEP = 10, BRK_STEP = 10
- };
- }
- class Car
- {
- private:
- char gamerID[CAR_CONST::ID_LEN];
- int fuelGauge;
- int curSpeed;
- public:
- void InitMembers(char *ID, int fuel);
- void ShowCarState();
- void Accel();
- void Break();
- };
- void Car::InitMembers(char *ID, int fuel)
- {
- strcpy(gamerID, ID);
- fuelGauge = fuel;
- curSpeed = 0;
- }
- void Car::ShowCarState()
- {
- cout << "userID : " << gamerID << endl;
- cout << "Gauge : " << fuelGauge << "%" << endl;
- cout << "Speed : " << curSpeed << "km/s" << endl << endl;
- }
- void Car::Accel()
- {
- if (fuelGauge <= 0)
- return;
- else
- fuelGauge -= CAR_CONST::FUEL_STEP;
- if ((curSpeed + CAR_CONST::FUEL_STEP) >= CAR_CONST::MAX_SPD)
- {
- curSpeed = CAR_CONST::MAX_SPD;
- return;
- }
- curSpeed += CAR_CONST::MAX_SPD;
- }
- void Car::Break()
- {
- if (curSpeed < CAR_CONST::BRK_STEP)
- {
- curSpeed = 0;
- return;
- }
- curSpeed -= CAR_CONST::BRK_STEP;
- }
- int main()
- {
- Car run99;
- run99.InitMembers("run99", 100);
- run99.Accel();
- run99.Accel();
- run99.Accel();
- run99.ShowCarState();
- cout << endl;
- run99.Break();
- run99.ShowCarState();
- return 0;
- }
[ 결과 ]
14행 : struct를 대신하여 class 선언이 삽입되었다. 따라서 이는 클래스 정의에 해당한다.
16행 : 접근제어 지시자중 private이 선언되었으므로, 이어서 등장하는 변수와 함수는 private에 해당하는 범위 내에서(클래스 내에서만) 접근이 가능하다.
20행 : 접근제어 지시자중 public이 선언되었으므로, 이어서 등장하는 변수와 함수는 public에 해당하는 범위 내에서(어디서든) 접근이 가능하다.
21, 27행 : 클래스 안에 선언된 변수의 초기화를 목적으로 정의된 함수이다. 변수가 모두 private으로 선언되어서 main 함수에서 접근이 불가능하다. 하지만 이 함수는 동일 클래스 내에 정의된 함수이므로 접근이 가능하다. 뿐만 아니라, 이 함수는 public으로 선언되어서 main 함수에서 호출이 가능하다. 따라서 main 함수에서는 이 함수의 호출을 통해서 클래스 안에 선언된 변수를 초기화 할 수 있다.
68행 : 초기화를 목적으로 InitMembers 함수를 호출하고 있다. 이 함수는 ID정보와 연료의 게이지 정보를 전달받아서 초기화 하는 형태로 정의되었다. 단 변수 curSpeed는 무조건 0으로 초기화 되도록 정의하였다.
68행~72행 : 함수 호출이 가능한 이유는 함수가 모두 public으로 선언되었기 때문이다.
5. 키워드 class를 이용해서 정의한 클래스에 선언된 변수와 함수에
별도의 접근제어 지시자를 선언하지 않으면 모든 변수와 함수는 private으로 선언된다.
문제1
계산기 기능의 Calculator 클래스를 정의해보자. 기본적으로 지니는 기능은 덧셈, 뺄셈, 곱셈, 나눗셈이며, 연산을 할 때 마다 어떠한 연산을 몇 번 수행했는지 기록되어야 한다. 아래의 main 함수와 실행의 예에 부합하는 Calculator 클래스를 정의하면 된다. 단, 멤버변수는 private로 멤버함수는 public으로 선언하자.
- int main()
- {
- Calculator cal;
- cal.Init();
- cout << "3.2 + 2.4 = " << cal.Add(3.2, 2.4) << endl;
- cout << "3.5 / 1.7 = " << cal.Div(3.5, 1.7) << endl;
- cout << "2.2 - 1.5 = " << cal.Min(2.2, 1.5) << endl;
- cout << "4.9 / 1.2 = " << cal.Div(4.9, 1.2) << endl;
- cal.ShowOpCount();
- cout << endl;
- return 0;
- }
문제2
문자열 정보를 내부에 자장하는 Printer라는 이름의 클래스를 디자인하자.
이 클래스의 두가지 능력은 문자열 저장, 문자열 출력이다.
아래의 main함수와 실행의 예에 부합하는 Printer 클래스를 정의하되
멤버변수는 private로 , 멤버함수는 public으로 선언하자.
- int main()
- {
- Printer pnt;
- pnt.SetString("Hello world!");
- pnt.ShowString();
- pnt.SetString("I love C++");
- pnt.ShowString();
- return 0;
- }
문제1 답
- #include <iostream>
- using namespace std;
- class Calculator
- {
- private:
- int addnum;
- int minnum;
- int mulnum;
- int divnum;
- public:
- void Init();
- double Add(double num1, double num2);
- double Min(double num1, double num2);
- double Mul(double num1, double num2);
- double Div(double num1, double num2);
- void ShowOpCount();
- };
- void Calculator::Init()
- {
- addnum = 0;
- minnum = 0;
- mulnum = 0;
- divnum = 0;
- }
- double Calculator::Add(double num1, double num2)
- {
- addnum++;
- return num1 + num2;
- }
- double Calculator::Min(double num1, double num2)
- {
- minnum++;
- return num1 - num2;
- }
- double Calculator::Mul(double num1, double num2)
- {
- mulnum++;
- return num1*num2;
- }
- double Calculator::Div(double num1, double num2)
- {
- divnum++;
- return num1 / num2;
- }
- void Calculator::ShowOpCount()
- {
- cout << "Add: " << addnum << ' ';
- cout << "Sub: " << minnum << ' ';
- cout << "Mul: " << mulnum << ' ';
- cout << "Div: " << divnum << ' ';
- }
- int main()
- {
- Calculator cal;
- cal.Init();
- cout << "3.2 + 2.4 = " << cal.Add(3.2, 2.4) << endl;
- cout << "3.5 / 1.7 = " << cal.Div(3.5, 1.7) << endl;
- cout << "2.2 - 1.5 = " << cal.Min(2.2, 1.5) << endl;
- cout << "4.9 / 1.2 = " << cal.Div(4.9, 1.2) << endl;
- cal.ShowOpCount();
- cout << endl;
- return 0;
- }
문제2 답
- #include <iostream>
- using namespace std;
- class Printer
- {
- private:
- char str[100];
- public:
- void SetString(char *st);
- void ShowString();
- };
- void Printer::SetString(char *st)
- {
- strcpy(str, st);
- }
- void Printer::ShowString()
- {
- cout << str << endl;
- }
- int main()
- {
- Printer pnt;
- pnt.SetString("Hello World!");
- pnt.ShowString();
- pnt.SetString("I love C++");
- pnt.ShowString();
- return 0;
- }
'Language > C++' 카테고리의 다른 글
C++ 기본(5) 클래스의 완성 (0) | 2017.01.04 |
---|---|
C++ 기본(4) 객체지향 프로그래밍의 이해 (0) | 2017.01.03 |
C++ 기본(2) - 구조체 (0) | 2016.12.23 |
8. C++ 기본(8) (0) | 2016.12.14 |
7. C++ 기본(7) (0) | 2016.12.13 |