C++ 클래스(class)와 객체(object)

ROK·2022년 11월 28일
0

열혈 C++

목록 보기
2/2

클래스와 객체

구조체는 클래스의 일종이라고 할 수 있다.
클래스와 구조체 선언에 있어 유일한 차이점은 struct가 아니라 class로 선언하면 구조체가 아닌 클래스가 된다.

클래스를 정의한 이후 변수를 선언할 때 차이가 있다.

앞서 구조체는 Car run99 = {"run99", 100, 0}과 같이 선언했지만, 클래스는 이 방식을 통해서 변수를 선언하지 못한다.

그 이유는 클래스 내에서 선언된 함수가 아닌, 다른 영역에서 변수를 초기화하려고 했기 때문이다.

클래스는 기본적으로 클래스 내에 선언된 변수는 클래스 내에 선언된 함수에서만 접근이 가능하다.

위 클래스의 정의에 따라서 Car run99;와 같이 클래스 변수를 선언한다.

클래스는 정의를 하는 과정에서 각 변수 및 함수의 접근 허용범위를 별도로 선언해야 한다.

접근제어 지시자(접근제어 레이블)

접근제어 지시자는 총 세가지가 존재한다.

  • 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(const char *ID, int fuel);
   void ShowCarState();
   void Accel();
   void Break();
};

void Car::InitMembers(const 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" << '\n'
        << 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()
{
   Car run99;
   run99.InitMembers("run99", 100);
   run99.Accel();
   run99.Accel();
   run99.Accel();
   run99.ShowCarState();
   run99.Break();
   run99.ShowCarState();

   return 0;
}

처음에 클래스를 선언할 때, private를 선언하고, public을 선언했다.

  • 이는, private가 선언된 이후에 등장하는 변수나 함수는 private에 해당하는 범위 내에서 접근이 가능하고
  • 이후 public이 선언되면서 그 이후로 등장하는 변수나 함수는 public에 해당하는 범위 내에서 접근이 가능하다.
  • 함수의 정의를 클래스 밖으로 빼도, 이는 클래스의 일부기 때문에 함수 내에서는 private로 선언된 변수에 접근이 가능하다.
  • private, public과 같이 접근제어 지시자를 선언하지 않으면,
    • 구조체는 default로 public이 선언되고,
    • 클래스는 default로 private이 선언된다.
profile
하루에 집중하자

0개의 댓글