Programming/C, C++

[C++] struct와 class 차이

변화의 물결1 2025. 3. 28. 12:09

 

 

안녕하세요.

 

 

  AI 코딩을 대신해 주고 편리함을 주고 있어 긍정적인 일이기도 하지만, 개발자라서 기본을 놓이고 너무 의존만 하는 같아서 다시 기본으로 돌아가보자는 생각으로 기초적인 다시 내용들을 정리해보려고 합니다

 

 프로그램 언어는 어떤 곳에서 사용하느냐에 따라서 Python, Java, Ruby, R 등 여러 가지 언어가 있지만, 임베디드를 개발하는 곳에서는 아직 C와 C++ 이 상당 부분 차지하고 있습니다.

 

 그중에 C언어에서 C++로 넘어왔다면 클래스와 객체지향 등 여러가지 용어를 들어 보았을 것입니다. Class C++에서 중요한 역할을 하고 있습니다.

 

 그런데 한번쯤 C++에서 struct class 무슨 차이가 있을까 생각을 했을 수도 있습니다. 왜냐하면, struct 안에도 함수를 넣어 사용할 있기 때문입니다. (단, .c 파일이 아니라 .cpp 파일로 컴파일할 경우)

 

 학교에서 배울 C++ 은 객체지향 방식으로 만들어졌다고 배우다 보니 struct 그냥 구조체로만 사용하고 Class를 사용해서 객체를 구현해야만 한다고 알고 있을 수도 있기 때문입니다.

 

 그렇다면 struct 정말 단순한 기능일까 궁금증을 가지고 struct class 동일한 기능을 지원하는지 알아보고 보겠습니다.

 

 테스트는 Qt Creator 15.0에서 console application 프로젝트로 진행했습니다.

 MSVC(VC++) qDebug() 부분을 std:cout 등 출력해 주는 부분만 변경한다면 동일한 결과를 확인할 있습니다.

 


  

1. Class Struct 선언 형식

 

 사용하는 이름만 다르고 동일합니다. 접근자(private, public)는 밑에서 다시 한번 설명하겠습니다.

 

 

Class 선언

class MyClass {
    int x; // x는 private
};

 

 

Struct 선언

struct MyStruct {
    int x; // x는 public
};

 

 

2. 상속과 생성자 확인

 

 struct는 상속과 생성자와 소멸자를 지원하는가?  확인해 보겠습니다.

 

 <--- code1 --->

#include <QCoreApplication>

struct base {
    int x;
};

struct MyStruct : base {
    MyStruct() {
        qDebug() << "생성자 호출!";
    }
    ~MyStruct() {
        qDebug() << "소멸자 호출!";
    }
};

int main(int argc, char *argv[])
{
    MyStruct obj; // 생성자가 자동 실행됩니다.
    return 0; // 프로그램 종료 시 소멸자가 실행됩니다.
}

 

 

 출력 결과를 보면 struct도 문제없이 동작한다는 것을 알 수 있습니다.

 

 

3. 접근 제한자

 

  class와 struct는 여기서 차이가 납니다. 접근 제한자를 사용했을 때와 사용하지 않았을 때 어떤 것을 기본 접근 제한자로 할 것인지가 차이입니다.

 

 struct는 접근 제한자를 사용하지 않는다면 public이 기본이 되고, class는 접근 제한자를 사용하지 않는다면 private이 기본이 됩니다.

 

<--- code2 --->

#include <QCoreApplication>

// struct 선언
struct MyStruct {
    int publicData;       // 기본적으로 public
private:
    int privateData;  // 명시적으로 private 설정
};

// class 선언
class MyClass {
    int privateData;      // 기본적으로 private
public:
    int publicData;   // 명시적으로 public 설정
};

int main(int argc, char *argv[]) {
    MyStruct s;
    MyClass c;

    // struct의 public 멤버는 직접 접근 가능
    s.publicData = 10;
    qDebug() << "Struct publicData: " << s.publicData;

    // struct의 private 멤버는 직접 접근 불가
    // s.privateData = 20; // 오류 발생

    // class의 private 멤버는 직접 접근 불가
    // c.privateData = 20; // 오류 발생

    // class의 public 멤버는 직접 접근 가능
    c.publicData = 30;
    qDebug() << "Class publicData: " << c.publicData;

    return 0;
}

 

 

 접근 제한자 역시 struct 사용가능하다는 것을 알 수 있습니다.

 그러나 기본설정(Default) 값이 어떤 것인지 차이가 있습니다.

 

 

4. 결 론

 

 사실상 기본 접근 제한자가 struct class 주요 차이점입니다. C++에서 struct와 class 중 어느 것을 사용하느냐는 프로그래머의 스타일과 코드의 목적에 따라 다를 있습니다. 이를 조금 깊이 들여다보면 다음과 같은 내용이 있을 있습니다.

 

1) 기능상 동일성

 

 struct class 모두 생성자, 소멸자, 상속, 멤버 함수 등을 지원하며, 동작 자체는 거의 완전히 동일합니다.

 

 

2) 프로그래밍 관례

 

 class 일반적으로 객체지향 프로그래밍에서 사용됩니다. , 데이터를 숨기고 메서드 중심으로 객체를 설계할 사용됩니다.

 

반면에, struct 주로 간단한 데이터 구조를 정의할 사용되는 경우가 많습니다. 이를 통해 코드 읽기가 직관적이 있습니다.

 

 

3) 스타일의 차이

 

일부 개발자들은 struct 기본적으로 간단한 데이터를 표현하는 구조체로 사용하고, class 복잡한 객체를 설계할 사용하여 가독성을 높이는 스타일을 따릅니다.

 

 

감사합니다.

 

 

반응형