Language/C++

[C++] 12.Unmanaged Programming: 구조체 VS 클래스

coco_daddy 2024. 1. 25. 13:05

구조체 VS 클래스

구조체(struct)와 클래스(class)는 C++에서 데이터를 그룹화하고 캡슐화하기 위한 두 가지 주요 방법이다. 이 둘은 많은 면에서 유사하지만 몇 가지 중요한 차이점이 있다.

공통점

  1. 멤버 변수와 함수 포함: 클래스와 구조체 모두 멤버 변수와 함수를 포함할 수 있다.
  2. 캡슐화: 멤버 변수와 함수를 하나의 단위로 캡슐화할 수 있다.
  3. 인스턴스 생성: 클래스와 구조체 모두 인스턴스를 생성하여 사용할 수 있다.

차이점

1. 기본 접근 권한

  • 구조체(struct): 기본적으로 모든 멤버가 public이다.
  • 클래스(class): 기본적으로 모든 멤버가 private이다.
// 구조체
struct Vector {
    int x;  // public
    int y;  // public
};

// 클래스
class Vector {
    int x;  // private
    int y;  // private
};

2. POCU Academy 코딩 표준

  • C++에서 구조체 사용: 구조체를 클래스처럼 사용할 수 있지만, 일반적으로 사용하지 않는 것이 좋다.
    • 구조체는 C 스타일로 유지되는 것이 좋다.
    • 구조체는 주로 순수한 데이터 객체(POD, Plain Old Data)로 사용된다.
    • 사용자가 선언한 생성자/소멸자 금지
    • static이 아닌 private/protected 멤버 변수 금지
    • 가상 함수 금지
    • 메모리 카피가 가능하면 좋다.
      • memcpy()를 이용하여 struct를 char[]로, 반대로도 복사할 수 있어야 한다.
      • 연결된 구조체 데이터를 memcpy를 이용해서 모든 값들을 복사할 수 있도록 하는 것이 유용하다.
      • 구조체 안에 int, float 등의 값들이 들어있는 경우 → memcpy로 그대로 복사 가능
      • 구조체 안에 int, Animal *, float 등의 클래스도 들어있는 경우 → Animal을 가리키는 주소만 복사가 된다.
        • 이런 경우 클래스를 쓰는 것이 낫다.
// C++에서 구조체 사용 예시
struct Point {
    int x;
    int y;
};

// C++에서 구조체 사용 (순수한 데이터 객체)
struct PODStruct {
    int data;
    char name[20];
}
  • 구조체 안에 클래스 객체 포함: 구조체 안에 클래스 객체를 넣으면 해당 클래스의 생성자/소멸자가 호출되고, 이는 메모리 복사 등에서 예상치 못한 동작을 일으킬 수 있다. 이런 경우에는 클래스를 사용하는 것이 더 안전하다.
// 안 좋은 예시: 구조체 안에 클래스 객체
struct BadStruct {
    int intValue;
    SomeClass classObj;  // 클래스 객체를 구조체에 포함
};

일반적으로 데이터 구조로 사용될 것이라면 구조체를, 객체 지향적인 기능이 필요하다면 클래스를 사용하는 것이 권장된다.