[C++] 클래스의 기본

C++ 2017. 12. 23. 17:19

1] C++ 에서의 구조체
1. C++ 에서의 구조체 변수의 선언
C언어 에서는 구조체를 다음과 같이 선언한다. 

struct Car basicCar;
struct Car simpleCar;

위와같이 C 언어에서 struct 키워드를 포함해야 하며 생략하기 위해서는 typedef을 별도로 추가해야 한다. 하지만 C++에서는 일반 자료형 변수의 선언방식과 크게 다를바 없다. 

Car basicCar;
Car simpleCar;

2. 구조체 안에 함수, enum 삽입하기

struct Car
{
    enum
    {
        ID_LEN = 20,
        MAX_SPD = 200,
        FUEL_STEP = 2,
        ACC_STEP = 10,
        BRK_STEP = 10
    }

    void ShowCarState()
    {
         ...
    }
    
    void Accel()
    {
        ...
    }

    void Break()
    {
        ...
    }
};

3. 함수는 외부로 뺄 수 있다. 

struct Car
{
    char gamerID[20];
    int fuelGuage;
    int curSpeed;
    
    void showCarState();
    void Accel();
};

void Car::ShowCarState()
{
    ...
}

void Car::Accel()
{
    ...
}

int main(void)
{
    Car run99 = { "run99", 100, 0 };
    
    run99.Accel();
    run99.ShowCarState();
}

사실 구조체 안에 함수가 정의되어 있으면, 다음의 의미가 더불어 내포된다. 
"함수를 인라인으로 처리해라!"
반면, 위의 예제와 같이 함수를 구조체 밖으로 빼내면, 이러한 의미가 사라진다. 따라서 인라인의 의미를 그대로 유지하려면 다음과 같이 키워드 "inline"을 이용해서 명시적으로 지시해야 한다. 

inline void Car::showCarState()
{
    ...
}

inline void Car::Accel()
{
    ...
}


2] 클래스(Class)와 객체(Object)
1. 클래스와 구조체의 차이점
앞서 선언했던 구조체 Car를 클래스로 정의해 보겠다.

Class Car
{
    char gamerID[20];
    int furlGauge;
    int curSpeed;
    
    void ShowCarState()
    {
        ...
    }
    
    void Accel()
    {
        ...
    }
}

구조체와 다른점은 앞에 "struct" 키워드를 "class"로 바꾼것 밖에 없다. 이제 사용할때의 차이점을 알아 보겠다.

Car run99 = {"run99", 100, 0}

위 코드는 컴파일 되지 않는다. 클래스 내에 선언된 변수는 앞에 접근지정자를 지정하지 않으면 자동으로 클래스 내의 함수에서 밖에 접근하지 못한다.

이렇듯 구조체와 클래스의 유일한 차이점은 외부에서 각각의 변수 및 함수에 접근 가능하도록 하려면 접근범위를 별도로 지정해야 되는지 아닌지에 차이가 있다. (사실 더 많은 차이가 있지만, 지금은 이 정도로만 알고 넘어가자.)

2. 접근제어 지시자 
- public: 어디서든 접근 허용
- protected: 상속관계에 놓여있을 때, 자식클래스만 접근 허용
- private: 클래스 내에서만 접근 허용

1) 만약 접근제어 지시자 A가 선언되면, 그 이후에 등장하는 변수나 함수는 A에 해당하는 범위 내에서 접근이 가능하다. 
2) 그러나 새로운 접근제어 지시자 B가 선언되면, 그 이후로 등장하는 변수나 함수는 B에 해당하는 범위 내에서 접근이 가능하다.
3)  구조체에서 접근제어 지시자를 지정하지 않으면 자동으로 public 지정되고, Class에서 지정하지 않으면 자동으로 private 지정된다. 

3. 파일 분할
: C++ 에서는 클래스의 선언을 .h 파일에 담고, 정의는 .cpp 파일에 담아 파일분할을 한다. 
즉, .h 파일에는 컴파일에 필요한 정보들을 담고 .cpp 파일에는 실제 구현내용을 담는다. 
링커는 .cpp에 있는 내용들로 서로 링크시켜서 하나의 실행파일 만든다. 

*inline 함수는 헤더파일에 함께 넣어야 한다. 
: inline 함수는 컴파일러에 의해 함수 호출부분을 구현부분으로 대체해야 하기 때문에 inline 함수의 구현은 .h 파일에 위치해야 컴파일러가 적절하게 컴파일 할 수 있다. 

'C++' 카테고리의 다른 글

[C++] Friend와 Static 그리고 Const  (0) 2017.12.25
[C++] 복사 생성자(Copy Constructor)  (0) 2017.12.23
[C++] 클래스의 완성  (1) 2017.12.23
[C++] C언어 기반의 C++(2)  (1) 2017.12.19
[C++] C언어 기반의 C++(1)  (0) 2017.12.18
Posted by 홍성곤
,