콘텐츠로 이동

구조체와 클래스 (Structs vs. Classes)

데이터를 나르는 수동적 객체에만 struct를 사용하고, 그 밖의 모든 것은 class로 만드세요.

struct와 class 키워드는 C++에서 거의 똑같이 동작합니다. 우리는 각 키워드에 고유한 의미를 부여하므로, 정의하려는 데이터 타입에 맞는 키워드를 사용해야 합니다.

struct는 데이터를 나르는 수동적 객체에 사용해야 하며, 관련 상수를 가질 수 있습니다. 모든 필드는 public이어야 합니다. struct 타입 자체에는 서로 다른 필드 사이의 관계를 함의하는 불변식이 있어서는 안 됩니다. 사용자가 그 필드에 직접 접근하면 그런 불변식이 깨질 수 있기 때문입니다. 다만 struct를 사용하는 쪽에서는 그것을 특정하게 사용하는 데 대한 요구 사항과 보장을 가질 수 있습니다. 생성자, 소멸자, 도우미 메서드는 있어도 되지만, 이런 메서드가 어떤 불변식을 요구하거나 강제해서는 안 됩니다.

기능이나 불변식이 더 필요하거나, struct의 가시성이 넓고 앞으로 발전할 것으로 예상된다면 class가 더 적합합니다. 의심스러우면 class로 만드세요.

STL과의 일관성을 위해, 특성(traits), 템플릿 메타함수, 일부 함수 객체처럼 상태가 없는 타입에는 class 대신 struct를 사용할 수 있습니다.

struct와 class의 멤버 변수는 명명 규칙이 서로 다르다는 점에 유의하세요.


옮긴이 풀이

핵심: struct는 "수동적 데이터 묶음"에만

struct와 class는 C++ 문법상 거의 같지만(기본 접근 지정자만 다름), 이 가이드에서는 의미를 구분해서 씁니다.

  • struct: 데이터를 그냥 담아 나르는 수동적 객체. 모든 필드는 public. 필드 사이에 지켜야 할 불변식(invariant)이 없어야 합니다. 생성자·소멸자·도우미 메서드는 둘 수 있지만, 불변식을 요구하거나 강제해서는 안 됩니다.
  • class: 그 외 전부. 불변식을 지켜야 하거나, 기능이 더 필요하거나, 노출 범위가 넓고 발전할 것 같으면 class입니다.

의심스러우면 class로 만드세요.

예외

특성(traits), 템플릿 메타함수, 일부 함수 객체처럼 상태 없는(stateless) 타입은 STL과의 일관성을 위해 struct로 둘 수 있습니다.

주의

struct와 class는 멤버 변수 명명 규칙이 다릅니다(예: class의 비공개 멤버는 뒤에 _). 둘 사이를 바꿀 때 함께 점검하세요.