struct와 class는 비슷하면서도 여러가지 차이점을 가지고 있다.
struct는 기본적으로 멤버 변수와 멤버 함수를 public
class는 기본적으로 멤버 변수와 멤버 함수를 private
예시:
struct MyStruct {
int x; // 외부에서 접근 가능 (public)
};
class MyClass {
public:
int y; // 외부에서 접근 가능
private:
int z; // 외부에서 직접 접근 불가능 (private)
};
struct은 상속에서 기본적으로 public 접근 지정자로써,
구조체로부터 상속한 멤버들은 외부에서 public으로 접근 가능.
class은 상속에서는 기본적으로 private 접근 지정자로써,
상속한 멤버들은 외부에서 private으로 접근 불가능.
예시:
struct BaseStruct {
int a; // 상속된 멤버는 public으로 유지
};
class BaseClass {
public:
int b; // 상속된 멤버는 private으로 변경
};
class: 기본적으로 초기화되지 않음. 멤버 변수를 선언한 후에 초기화를 별도로 해주어야 함.
struct: 기본적으로 "0"으로 초기화. 숫자형 멤버 변수는 0으로 초기화되고, 포인터 멤버 변수는 nullptr로 초기화.
예시:
class MyClass {
public:
int num; // 초기화 X
};
struct MyStruct {
int num; // 0으로 초기화
};
struct 키워드를 사용하지 않아도 된다.예시:
class MyClass {
public:
MyClass() {
// 생성자 정의
}
};
struct MyStruct {
MyStruct() {
// 생성자 정의
}
};
MyClass obj_C; // 클래스의 객체 생성
MyStruct ob_S; // 구조체의 객체 생성
차이점 중에서 가장 많이 얘기하는 메모리 부분이다.
class: 기본적으로 class 객체는 동적 할당 된다. 클래스 객체를 생성할 때 new 키워드를 사용하여 힙(heap) 메모리에 할당하며, 객체의 수명은 delete로 직접 관리.
MyClass* obj = new MyClass; // 힙 메모리에 할당
struct: 주로 스택(stack) 메모리에 할당 된다. 구조체 객체를 선언할 때 자동으로 스택에 할당되며, 객체의 수명은 스코프(scope)에 따라 관리.
MyStruct obj; // 스택에 구조체 객체 할당