클래스와 구조체의 유일한 차이점
키워드 struct를 대신해서 class를 사용하면, 구조체가 아닌 클래스가 된다.
class Car
{
char ID[CAR_CONST::ID_LEN];
int fuel;
int curspd;
void showstate();
void accel();
void brake();
....
}
하지만, 이렇게 키워드를 바꿔놓으면 앞서 예제에서 보였던 다음의 방식으로 선언하지 못한다.
Car car={"himan", 99, 0}; // (X) -> 구조체 변수 초기화 방식
이유 : 클래스 내에서 선언된 함수가 아닌, 다른 영역에서 변수를 초기화하려 했기 때문.
클래스는 기본적으로(별도의 선언을 하지 않으면) 클래스 내에 선언된 변수는 클래스 내에 선언된 함수에서만 접근이 가능하다.
따라서 다음과 같은 형태로 클래스 변수를 선언
Car car; // (O)
그럼 어떻게 초기화? 변수 선언 후에 초기화?
int main(void)
{
Car car;
strcpy(car.ID, "himan"); // (X)
car.fuel = 100; // (X)
car.curspd = 0; // (X)
....
하지만 위의 코드는 모두 컴파일이 되지 않는다.
클래스 내에 선언된 변수는 기본적으로 클래스 내에 선언된 함수에서만 접근 가능
"그럼 접근이 불가능한데, 어디다 써먹음?"
클래스는 멤모의 접근과 관련해서 다음과 같이 이야기
"접근과 관련해서 별도의 선언을 하지 않으면, 클래스 내에 선언된 변수 및 함수에 대한 접근은 허용하지 않음. 따라서 접근과 관련된 지시를 별도로 내려"
이럿듯 클래스는 정의를 하는 과정에서 각각의 변수 및 함수의 접근 허용범위를 별도로 선언해야 한다.
그리고 바로 이것이 키워드 struct를 이용해서 정의하는 구조체와 키워드 class를 이용해서 정의하는 유일한 차이점
접근제어 지시자(접근제어 레이블)
C++의 접근제어 지시자는 다음과 같이 총 세가지가 존재.
public, protected, private
이들이 의미하는 바는 아래와 같다.
- public : 어디서든 접근허용
- protected : 상속관계에 놓여있을 때, 유도 클래스에서의 접근허용
- privated : 클래스 내(클래스 내에 정의된 함수)에서만 접근허용
#define _CRT_SECURE_NO_WARNINGS
#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: // 클래스 내에 정의된 함수에서만 접근 허용 -> main 함수에서 접근 불가능
char ID[CAR_CONST::ID_LEN];
int fuel;
int curspd;
public: // 어디서든 접근허용 -> main 함수에서 접근 가능, main에서 함수호출을 통해 클래스 안에 변수를 초기화 할 수 있다.
void init(const char* ID, int fuel);
void showstate();
void accel();
void brake();
};
void Car::init(const char* input_ID, int input_fuel)
{
strcpy(ID, input_ID);
fuel = input_fuel;
curspd = 0;
}
void Car::showstate()
{
cout << "ID : " << ID << endl;
cout << "연료량 : " << fuel << endl;
cout << "현재속도 : " << curspd << endl << endl;;
}
void Car::accel()
{
if (fuel <= 0)
return;
else
fuel -= CAR_CONST::FUEL_STEP;
if (curspd + CAR_CONST::ACC_STEP >= CAR_CONST::MAX_SPD)
{
curspd = CAR_CONST::MAX_SPD;
return;
}
curspd += CAR_CONST::ACC_STEP;
}
void Car::brake()
{
if (curspd < CAR_CONST::BRK_STEP)
{
curspd = 0;
return;
}
curspd -= CAR_CONST::BRK_STEP;
}
int main(void)
{
Car sedan;
sedan.init("himan", 100);
sedan.accel();
sedan.accel();
sedan.accel();
sedan.showstate();
sedan.brake();
sedan.showstate();
return 0;
}
- 접근제어 지시자 A가 선언되면, 그 이후에 등장하는 변수나 함수는 A에 해당하는 범위 내에서 접근 가능
- 접근제어 지시자 B가 새롭게 선언되면, 그 이후에 등장하는 변수나 함수는 B에 해당하는 범위 내에서 접근 가능
- 함수의 정의를 클래스 밖으로 빼도, 클래스의 일부이기 때문에, 함수 내에서는 private로 선언된 변수에 접근 가능
- 키워드 struct를 이용해서 정의한 구조체(클래스)에 선언된 변수와 함수에 별도의 접근제어 지시자를 선언하지 않으면, 모든 변수와 함수는 public으로 선언된다.
- 키워드 class를 이용해서 정의한 클래스에 선언된 변수와 함수에 별도의 접근제어 지시자를 선언하지 않으면, 모든 변수와 함수는 private로 선언된다.
그리고 위에서 설명하는 struct와 class의 선언에 따른 차이가 구조체와 클래스의 유일한 차이점.
즉, 구조체도 클래스도 접근제어 지시자의 선언이 가능하고, 그 의미도 동일하다.
다만 접근제어 지시자를 선언하지 않았을 때 클래스는 private으로 구조체는 public으로 선언할 뿐이다.
레이블 : 접근제어 지시자의 뒤에는 콜론(:)이 붙는데, 이는 접근제어 지시자가 특정 위치정보를 알리는 '레이블(라벨)'이기 때문이다. 우리가 알고 있는. switch문에 사용되는 case도 레이블이기 때문에 콜론이 붙는다.
참고 : [윤성우 열혈 C++ 프로그래밍] - 대부분의 내용 및 코드는 이 책에서 개인 공부 정리 목적으로 참고하였습니다.
'Language&Framework&Etc > C++' 카테고리의 다른 글
클래스의 기본(03-3) 객체지향 프로그래밍의 이해 (0) | 2020.12.24 |
---|---|
클래스의 기본(03-2) 클래스(Class)와 객체(Object)-2 (0) | 2020.12.24 |
클래스의 기본(03-1) C++에서의 구조체 (0) | 2020.12.23 |
C언어 기반의 C++ 2(02-6) C++에서 C언어의 표준함수 호출하기 (0) | 2020.12.23 |
C언어 기반의 C++ 2(02-5) malloc & free를 대신하는 new & delete (0) | 2020.12.23 |