Notice
Recent Posts
Recent Comments
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

SYDev

C++ Chapter 03-2 : 클래스(Class)와 객체(Object)(1) 본문

Programming Lang/C++

C++ Chapter 03-2 : 클래스(Class)와 객체(Object)(1)

시데브 2023. 7. 12. 20:57

클래스(Class) vs. 구조체(Struct)

 Chapter 03-1에서 설명한 구조체는 클래스의 일종이다. 또한 구조체를 작성해놓은 코드에서 키워드 struct만 class로 바꿔버리면 구조체가 클래스로 바뀌어버린다. 그렇다면 이외에 클래스와 구조체는 무슨 차이점이 있을까? 

 

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

 클래스와 구조체의 유일한 차이점은 변수 및 함수의 접근 허용범위 설정의 유무이다. 클래스는 구조체와 달리 정의하는 과정에서 클래스 내부의 변수 및 함수의 접근 허용범위를 별도로 선언해야 한다. 

 

  그리고 이런 클래스의 접근제어 지시자에는 총 3가지가 있다.

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

 이중에서 protected는 '상속'과 관련이 있는 내용으로 나중에 살펴보도록 하고, 나머지 둘에 대해서 얘기해보자.

 

  다음 예제를 살펴보자.

#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 // struct 대신 class를 삽입
{
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) // 동일 클래스 내에서 선언된 함수이기 때문에 private 변수에 접근 가능
{
    strcpy(gamerID, ID);
    fuelGauge=fuel;
    curSpeed=0;
}

void Car::ShowCarState()
{
    cout<<"소유자 ID: "<<gamerID<<endl;
    cout<<"연료량: "<<fuelGauge<<"%"<<endl;
    cout<<"현재속도: "<<curSpeed<<"km/s"<<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); // public에서 선언된 함수이기 때문에 클래스 외부에서도 호출 가능
    run99.Accel();
    run99.Accel();
    run99.Accel();
    run99.ShowCarState();
    run99.Break();
    run99.ShowCarState();

    return 0;
}
소유자 ID: run99
연료량: 94%
현재속도: 30km/s
소유자 ID: run99
연료량: 94%
현재속도: 20km/s

 추가적으로 struct는 별도의 접근제어 지시자를 선언하지 않으면 모든 변수와 함수는 public으로 선언되며 classprivate으로 선언된다.

 


출처 : 윤성우, <윤성우의 열혈 C++ 프로그래밍>, 오렌지미디어, 2010.05.12