C#에서 클래스와 구조체의 차이점
C#에서 클래스(Class)와 구조체(Structure)를 구분하려면, 먼저 두 개념이 데이터를 정의하고 저장하는 측면에서는 사실상 동등한 역할을 한다는 점을 이해해야 합니다. 두 형식 모두 데이터 멤버를 정의할 수 있으며 기본값을 가질 수 있습니다.
그러나 이 범위를 넘어 더 깊이 살펴보면, 클래스가 구조체보다 훨씬 더 많은 유연성과 다양한 기능을 제공한다는 것을 알 수 있습니다. 아래 표는 클래스와 구조체의 핵심적인 차이점을 정리한 것입니다.
클래스 vs 구조체 주요 차이점 비교표
| 번호 | 구분 기준 | 클래스(Class) | 구조체(Structure) |
|---|---|---|---|
| 1 | 데이터 타입 | 클래스에 정의된 데이터는 메모리에 참조(reference) 형태로 저장되며, 접근을 위한 특정 주소를 가집니다. 따라서 클래스는 참조 타입(Reference Type)이라고 할 수 있습니다. | 반면 구조체에서는 데이터 멤버의 값이 스택(stack) 또는 이를 포함하는 형식 내부에 직접 저장됩니다. 따라서 구조체는 값 타입(Value Type)으로 간주됩니다. |
| 2 | 저장 위치 | 앞서 언급했듯이 클래스의 데이터 멤버는 참조 형태로 저장되며, 참조 타입은 힙(heap) 메모리에 할당됩니다. | 반면 구조체는 값을 직접 저장하므로, 값 타입은 스택(stack) 메모리에 할당됩니다. |
| 3 | 생성자 | 클래스는 생성자(Constructor)뿐만 아니라 소멸자(Destructor)도 함께 정의할 수 있습니다. 해당 기능이 구현되어 있기 때문입니다. | 반면 구조체는 전통적으로 생성자나 소멸자를 지원하지 않았습니다. 단, 최신 C# 버전(C# 10 이상)에서는 매개변수 없는 생성자 선언이 가능해졌지만, 소멸자는 여전히 지원되지 않습니다. |
| 4 | 인스턴스화 | 클래스는 생성자와 함께 설계되었기 때문에 new 키워드를 사용하여 인스턴스를 생성해야 합니다. | 반면 구조체는 new 키워드 없이도 인스턴스를 생성할 수 있습니다. |
| 5 | 상속 | 클래스는 상속(Inheritance) 기능을 지원하므로, 부모 클래스로부터 속성과 동작을 물려받을 수 있습니다. | 반면 구조체는 상속을 지원하지 않습니다. |
| 6 | protected 한정자 | 클래스는 protected 한정자를 지원하므로, 클래스 내부에 정의된 데이터 멤버에 이를 적용할 수 있습니다. | 반면 구조체는 protected 한정자를 지원하지 않습니다. |
정리
요약하자면, 상속이나 다형성 같은 객체지향 기능이 필요한 복잡한 객체를 다룰 때는 클래스가 적합하고, 좌표나 색상 값처럼 작고 단순한 데이터 묶음을 다룰 때는 구조체를 사용하는 것이 효율적입니다. 두 형식의 메모리 할당 방식과 기능적 차이를 잘 이해하고 상황에 맞게 선택하는 것이 중요합니다.