C++에서 구조체(struct)와 클래스(class)는 문법적으로 거의 동일하지만, 몇 가지 중요한 차이점이 있습니다. 이 차이점을 정확히 이해하면 상황에 맞게 클래스와 구조체 중 어느 것을 선택해야 할지 판단하는 데 큰 도움이 됩니다.
클래스와 구조체의 주요 차이점
가장 핵심적인 차이는 기본 접근 지정자(default access specifier)입니다.
- 클래스: 모든 멤버가 기본적으로
private로 선언됩니다. - 구조체: 모든 멤버가 기본적으로
public으로 선언됩니다.
즉, 접근 지정자를 명시하지 않으면 클래스의 멤버는 외부에서 직접 접근할 수 없지만, 구조체의 멤버는 자유롭게 접근할 수 있습니다.
클래스 예제 - 컴파일 오류 발생
#include <iostream>
using namespace std;
class Example {
int val; // 기본적으로 private
};
int main() {
Example obj;
obj.val = 20; // 오류! private 멤버에 직접 접근 불가
return 0;
}위 프로그램은 컴파일 오류가 발생합니다. val이 기본적으로 private이기 때문에 객체 obj를 통해 직접 접근할 수 없기 때문입니다.
구조체 예제 - 정상 동작
#include <iostream>
using namespace std;
struct Example {
int val; // 기본적으로 public
};
int main() {
Example obj;
obj.val = 20;
cout << "Value is: " << obj.val;
return 0;
}출력 결과
Value is: 20
위 프로그램은 정상적으로 실행됩니다. 구조체의 멤버 val은 기본적으로 public이므로 객체를 통해 직접 접근할 수 있기 때문입니다.
상속 시의 차이점
클래스와 구조체의 또 다른 차이점은 상속(inheritance) 과정에서 드러납니다.
- 클래스 상속: 상속 시 기반 클래스(base class)의 접근 지정자는 기본적으로
private입니다. - 구조체 상속: 상속 시 기반 구조체(base struct)의 접근 지정자는 기본적으로
public입니다.
예를 들어 struct Derived : Base처럼 작성하면 Base의 public 멤버가 그대로 public으로 유지되지만, class Derived : Base로 작성하면 Base의 public 멤버가 파생 클래스에서 private이 됩니다.
그렇다면 언제 무엇을 사용해야 할까?
C++에서는 두 키워드의 기능적 차이가 위 사항뿐이므로, 결국 코딩 스타일과 관례(convention)에 따라 선택하는 것이 일반적입니다.
- 구조체를 사용하는 경우: 단순히 데이터를 묶어서 담는 용도(Plain Old Data)일 때, 즉 캡슐화나 복잡한 로직 없이 데이터만 전달하는 경우에 적합합니다.
- 클래스를 사용하는 경우: 데이터와 이를 조작하는 메서드를 함께 캡슐화하고, 접근 제어·상속·다형성 등 객체지향 설계가 필요한 경우에 적합합니다.
요약하면, C++에서 클래스와 구조체의 실질적 차이는 기본 접근 지정자(private vs public)와 상속 시 기본 접근 방식뿐입니다. 데이터 중심의 간단한 구조에는 구조체를, 완전한 객체지향 설계에는 클래스를 사용하는 것이 C++ 커뮤니티의 일반적인 관례이며, 코드의 의도를 명확하게 전달하는 데 도움이 됩니다.