나만의 작은 도서관

[C++] 탐구 일지 #4. struct와 class의 차이 본문

C++/문법 및 메소드(STL)

[C++] 탐구 일지 #4. struct와 class의 차이

pledge24 2025. 2. 19. 00:00

배경

여기저기 코드를 보다 보면 class의 전유물이라고 생각했던 기능들이 struct에서 멀쩡히 돌아가는 경우를 종종 보았다. 이것도 돼? 저것도 돼? 하며 놀란적이 한두 번이 아닌데, 이번 시간에는 struct가 어디까지 가능한지 알아보도록 한다.


C++에서 struct와 class는 맥락상 동일하다.

매우 충격적인 결과지만 사실이다. 유일한 차이점으로 기본 접근 지정자(Access specifier)가 struct은 public, class는 private이다. 이거 말곤 전부 똑같다. (어셈블리 언어로 변환해서 봐도 완전히 동일한 구조를 가지고 있다.)

 

아래 코드에서의 MyStruct와 MyClass는 기본 접근 지정자만 다를뿐 완전히 같다.

#include <iostream>

using namespace std;

struct MyStruct{
// public:
    int a = 10;
    int b = 20;
};

class MyClass{
// private:
    int a = 10;
    int b = 20;
};

int main(){
    MyStruct myStruct;
    cout << myStruct.a << '\n'; // 10

    MyClass myClass;
    cout << myClass.a << '\n';  // Error: 멤버 "MyClass::a" (선언됨 줄 13)에 액세스할 수 없습니다.
}

 

정말로 다된다.

#include <iostream>

using namespace std;

struct MyStruct
{
    /* 순수 가상 함수 */
    virtual void virtualFunc() = 0;

/* public 멤버 변수 */
public:
    int a = 10;
    int b = 20;

};

struct MyStruct2 : public MyStruct
{
/* 생성자, 소멸자 */
public:
    MyStruct2()  { cout << "MyStruct2 생성" << '\n';}
    ~MyStruct2() { cout << "MyStruct2 소멸" << '\n';}

/* 멤버 함수 */
public:

    void print_a() {
        cout << _a << '\n';
    }

    /* 순수 가상 함수 재정의(override) */
    virtual void virtualFunc() override {
        cout << "virtualFunc" << '\n';
    }

/* private 멤버 변수 */
private:
    int _a = 11;
    int _b = 12;
};

int main(){
    {
        MyStruct2 myStruct2;

        cout << myStruct2.a << '\n';
        myStruct2.print_a();
        myStruct2.virtualFunc();
    }
}

 

실행 결과

MyStruct2 생성
10
11
virtualFunc
MyStruct2 소멸

 


참고 자료

https://learn.microsoft.com/ko-kr/cpp/cpp/classes-and-structs-cpp?view=msvc-170

 

클래스 및 구조체(C++)

자세한 정보: 클래스 및 구조체(C++)

learn.microsoft.com