본문 바로가기
c++

[C++]클래스와 객체

by goblin- 2023. 2. 9.

클래스와 구조체의 코드구조의 차이점은 struct 대신 class를 쓴다는 점이다. 

class car{...}
struct car{...}

또한 클래스와 구조체의 차이점은 접근제어 지시자를 통하여 차이점을 설명할 수 있다.

 

그전 세 가지 접근제어 지시자를 살펴보겠다.

 

  • public : 어디서든 접근허용
  • protected : 상속관계에 놓여있을 때, 유도 클래스에서의 접근허용
  • private : 클래스 내(클래스 내에 정의된 함수)에서만 접근허용

 

접근제어 지시자를 사용하여 함수의 접근을 제어할 수 있다.

 

 

구조체와 클래스의 차이점
  • sturct를 이용해서 정의한 구조체(클래스)에 선언된 변수와 함수에 별도의 접근제어 지시자를 선언하지 않으면, 모든 변수와 함수는 public으로 선언된다.
  • class를 이용해서 정의한 클래스에 선언된 변수와 함수에 별도의 접근제어 지시자를 선언하지 않으면, 모든 변수와 함수는 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<<"소유자ID: "<<gamerID<<endl;
    cout<<"연료량: "<<fuelGauge<<"%"<<endl;
    cout<<"현재속도: "<<curSpeed<<"km/s"<<endl<<endl;
}

void Car::Accel(){
    if(fuelGauge<=0)
        return;
    else
        fuelGauge-=CAR_CONST::FUEL_STEP;
    
    if((curSpeed+CAR_CONST::ACC_STEP)>=CAR_CONST::MAX_SPD){
        curSpeed=CAR_CONST::MAX_SPD;
        return;
    }
    curSpeed+=CAR_CONST::ACC_STEP;
}

void Car::Break(){
    if(curSpeed<CAR_CONST::BRK_STEP){
        curSpeed=0;
        return;
    }
    curSpeed-=CAR_CONST::BRK_STEP;
}

int main(void){
    Car run99;
    run99.InitMembers("run99",100);
    run99.Accel();
    run99.Accel();
    run99.Accel();
    run99.ShowCarState();
    run99.Break();
    run99.ShowCarState();
    return 0;
}
결과
소유자ID: run99
연료량: 94%
현재속도: 30km/s

소유자ID: run99
연료량: 94%
현재속도: 20km/s

다음 함수를 살펴보면 class를 통하여 car를 정의하였다. class 안에서 정의된 private안의 변수와 함수는 클래스 내에서만 접근이 가능하다. public안에서 정의된 변수와 함수는 public에 해당하는 범위 내에서(어디서든) 접근이 가능하다.

메인함수에서 선언된 함수호출은 모두 class 내에서 public으로 선언되었기 때문에 가능하다.

함수의 정의는 클래스 밖으로 빼도, 이는 클래스의 일부이기 때문에, 함수 내에서는 private으로 선언된 변수에 접근이 가능하다.

 

용어정리

구조체 변수, 클래스 변수라는 표현은 어울리지 않다. 왜냐하면 구조체와 클래스는 변수의 성격만 지니는 것이 아니기 때문이다 그래서 우리는 객체라는 표현을 사용한다. 위의 코드에서 선언된 run99는 '변수'가 아닌 '객체'이다. 그리고 클래스를 구성하는 변수를 가리켜 멤버변수라고 하고, 클래스를 구성하는 함수를 가리켜 멤버함수라 한다.

 

Car 클래스를 구성하는 멤버변수

  • char gamerID [CAR_CONST::ID_LEN];
  • int fuelGauge;
  • int curSpeed;

 

Car 클래스를 구성하는 멤버함수

  • void InitMembers(char *ID, int fuel);
  • void ShowCarState();
  • voidAccel();
  • void Break();