구조체와 클래스 (Structs vs. Classes)¶
데이터를 전달하는 수동 객체에만 구조체를 사용하세요. 다른 모든 것은 클래스입니다.
struct 및 class 키워드는 C++에서 거의 동일하게 동작합니다. 각 키워드에 의미론적 의미를 추가하므로 정의하는 데이터 유형에 적합한 키워드를 사용해야 합니다.
구조체는 데이터를 전달하는 수동 객체에 사용해야 하며 관련 상수가 있을 수 있습니다. 모든 필드는 공개되어야 합니다. 구조체 유형 자체에는 서로 다른 필드 간의 관계를 암시하는 불변성이 있어서는 안 됩니다. 사용자가 해당 필드에 직접 액세스하면 불변성이 깨질 수 있지만 구조체 사용자는 해당 필드의 특정 사용에 대한 요구 사항과 보장을 가질 수 있기 때문입니다. 생성자, 소멸자 및 도우미 메서드가 있을 수 있습니다. 그러나 이러한 방법은 불변성을 요구하거나 시행해서는 안 됩니다.
더 많은 기능이나 불변성이 필요하거나 구조체의 가시성이 광범위하고 발전할 것으로 예상되는 경우 클래스가 더 적합합니다. 의심스러우면 클래스로 만드세요.
STL과의 일관성을 위해 특성, 템플릿 메타함수 및 일부 기능자와 같은 상태 비저장 유형에 대해 클래스 대신 구조체를 사용할 수 있습니다.
구조체와 클래스의 멤버 변수에는 서로 다른 명명 규칙이 있다는 점에 유의하세요.
이해하기 쉽게 설명하기¶
핵심: struct는 "수동적 데이터 묶음"에만¶
struct와 class는 C++ 문법상 거의 같지만(기본 접근 지정자만 다름), 이 가이드에서는 의미를 구분해서 씁니다.
- struct: 데이터를 그냥 담아 나르는 수동적 객체. 모든 필드는 public. 필드 사이에 지켜야 할 불변식(invariant)이 없어야 합니다. 생성자·소멸자·도우미 메서드는 둘 수 있지만, 불변식을 요구하거나 강제해서는 안 됩니다.
- class: 그 외 전부. 불변식을 지켜야 하거나, 기능이 더 필요하거나, 노출 범위가 넓고 발전할 것 같으면 class입니다.
의심스러우면 class로 만드세요.
예외¶
특성(traits), 템플릿 메타함수, 일부 함수 객체처럼 상태 없는(stateless) 타입은 STL과의 일관성을 위해 struct로 둘 수 있습니다.
주의¶
struct와 class는 멤버 변수 명명 규칙이 다릅니다(예: class의 비공개 멤버는 뒤에 _). 둘 사이를 바꿀 때 함께 점검하세요.