결론부터 말하면: C++에서는 사실상 차이가 없습니다
C++에서는 struct와 typedef struct 사이에 실질적인 차이가 없습니다. 그 이유는 C++에서 모든 struct, union, enum, class 선언이 마치 암시적으로 typedef된 것처럼 동작하기 때문입니다. 다만, 같은 이름을 가진 다른 선언에 의해 이름이 가려지지 않는 경우에 한정됩니다.
즉, C++에서는 다음과 같이 구조체 이름을 곧바로 타입처럼 사용할 수 있습니다.
struct Point {
int x;
int y;
};
Point p1; // 'struct Point'라고 쓰지 않아도 됨C 언어라면 struct Point p1;처럼 매번 struct 키워드를 붙여야 하기 때문에 typedef struct { ... } Point; 형태의 관용구가 널리 쓰였지만, C++에서는 이런 번거로움이 사라진 것입니다.
한 가지 미묘한 차이점: 전방 선언(forward declaration)
완전히 동일한 것은 아닙니다. typedef 자체는 전방 선언할 수 없다는 점에서 미묘한 차이가 존재합니다.
typedef를 사용하는 방식을 택했다면, 해당 typedef가 정의된 헤더 파일을 사용 지점보다 먼저 반드시 포함(include)해야 합니다. 반면 일반적인 구조체라면 아래와 같이 전방 선언만으로 포인터나 참조 타입을 사용할 수 있습니다.
// 전방 선언
struct Widget;
void process(Widget& w); // 정의 없이도 사용 가능하지만 typedef로 선언된 이름은 이렇게 별도로 전방 선언해 둘 수 없으므로, 컴파일러가 그 이름을 알기 위해서는 typedef가 담긴 파일을 직접 포함해야 합니다. 규모가 큰 프로젝트에서 컴파일 의존성을 줄이려 한다면 이 차이를 기억해 두는 것이 좋습니다.
정리
- C++에서
struct와typedef struct는 기능적으로 거의 동일합니다. - C++의 구조체·클래스 이름은 암시적으로 타입 이름으로 동작하므로, C 스타일의
typedef관용구가 더 이상 필요하지 않습니다. - 유일한 차이는 typedef는 전방 선언이 불가능하다는 점이며, 따라서 typedef를 쓰려면 정의가 있는 파일을 먼저 포함해야 합니다.