구조체 VS 클래스
구조체(struct)와 클래스(class)는 C++에서 데이터를 그룹화하고 캡슐화하기 위한 두 가지 주요 방법이다. 이 둘은 많은 면에서 유사하지만 몇 가지 중요한 차이점이 있다.
공통점
- 멤버 변수와 함수 포함: 클래스와 구조체 모두 멤버 변수와 함수를 포함할 수 있다.
- 캡슐화: 멤버 변수와 함수를 하나의 단위로 캡슐화할 수 있다.
- 인스턴스 생성: 클래스와 구조체 모두 인스턴스를 생성하여 사용할 수 있다.
차이점
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; // 클래스 객체를 구조체에 포함
};
일반적으로 데이터 구조로 사용될 것이라면 구조체를, 객체 지향적인 기능이 필요하다면 클래스를 사용하는 것이 권장된다.
'Language > C++' 카테고리의 다른 글
[C++] 14.Unmanaged Programming: 함수 오버로딩 (0) | 2024.01.25 |
---|---|
[C++] 13.Unmanaged Programming: 복사 생성자 (0) | 2024.01.25 |
[C++] 11.Unmanaged Programming: Const flag (0) | 2024.01.25 |
[C++] 10.Unmanaged Programming: 소멸자(Destructor) (0) | 2024.01.23 |
[C++] 9.Unmanaged Programming: 생성자(Constructor) (0) | 2024.01.23 |