【 C# 구조체와 클래스의 차이점 정리 】
C#을 개발하다 보면 " 클래스(calss)"와 "구조체(struct)" 중 무엇을 사용할지 고민하게 되는 경우가 많습니다. 둘 다 객체를 정의하는 데 쓰이지만, 그 용도와 동작 방식은 크게 다릅니다. 오늘은 C#에서 클래스와 구조체의 차이점을 자세히 살펴보고, 언제 각각을 사용해야 하는지 알아보겠습니다.
【 값 타입 vs 참조 타입 】
첫 번째 차이점은 값 타입과 참조 타입의 구분입니다.
- 클래스는 참조 타입(reference type)입니다. 클래스 객체는 힙(Heap) 메모리에 저장되고, 해당 객체를 참조하는 변수는 그 객체의 메모리 주소를 가리킵니다. 따라서 두 개의 클래스 변수가 같은 객체를 가리킬 수 있으며, 객체가 변경되면 이를 참조하는 모든 변수가 영향을 받습니다.
- 구조체는 값 타입(value type)입니다. 구조체 변수는 데이터를 직접 저장하므로, 구조체를 복사할 경우 데이터 자체가 복사됩니다. 따라서 두 개의 구조체 변수는 서로 독립적인 값을 갖습니다.
// 클래스는 참조 타입
class Person
{
public string Name;
}
Person person1 = new Person();
person1.Name = "Alice";
Person person2 = person1;
person2.Name = "Bob";
Console.WriteLine(person1.Name); // 출력: Bob (같은 객체 참조)
// 구조체는 값 타입
struct Point
{
public int X;
public int Y;
}
Point point1 = new Point { X = 10, Y = 20 };
Point point2 = point1;
point2.X = 30;
Console.WriteLine(point1.X); // 출력: 10 (값 복사)
【 메모리 할당 】
클래스는 힙(Heap) 메모리에 할당되고, 가비지 컬렉터(GC)에 의해 관리됩니다. 객체가 더 이상 참조되지 않으면 GC가 자동으로 메모리를 해제합니다. 반면, 구조체는 스택(Stack) 메모리에 할당됩니다. 스택에 할당된 값 타입은 범위(scope)를 벗어나면 즉시 메모리에서 해제됩니다. 이로 인해 구조체는 메모리 할당이 더 빠르지만, 대량의 데이터를 저장할 때는 성능에 부담이 될 수 있습니다.
【 상속과 다형성 】
클래스는 상속(inheritance)과 다형성(polymorphism)을 지원합니다. 즉, 클래스는 다른 클래스로부터 상속받아 기능을 확장할 수 있으며, 인터페이스를 구현하여 다형성을 활용할 수 있습니다. 반면, 구조체는 상속을 지원하지 않습니다. 구조체는 상속 계층이 없으며, 다형성도 사용할 수 없습니다.
// 클래스 상속 가능
class Animal
{
public virtual void Speak() => Console.WriteLine("Animal sound");
}
class Dog : Animal
{
public override void Speak() => Console.WriteLine("Bark");
}
// 구조체는 상속 불가
struct Coordinates
{
public int X, Y;
}
【 기본 생성자 】
클래스는 기본 생성자(default constructor)를 명시적으로 선언할 수 있습니다. 하지만 구조체는 기본 생성자를 제공하지 않으며, 사용자 정의 기본 생성자를 만들 수 없습니다. 구조체는 선언된 모든 필드를 초기화하는 생성자를 제공하거나, 기본값을 자동으로 할당합니다.
// 구조체는 기본 생성자를 사용할 수 없음
struct Rectangle
{
public int Width;
public int Height;
// 사용자 정의 생성자
public Rectangle(int width, int height)
{
Width = width;
Height = height;
}
}
// 클래스를 위한 생성자
class Box
{
public int Width;
public int Height;
public Box(int width, int height)
{
Width = width;
Height = height;
}
}
【 성능과 사용 사례 】
구조체는 크기가 작은 데이터를 저장할 때 유리합니다. 구조체는 값 타입이므로 스택 메모리를 사용하며, 복사할 때 값 자체를 복사하므로 참조 타입보다 성능이 좋습니다. 하지만 데이터 크기가 크거나 자주 복사해야 할 경우, 성능에 부담이 될 수 있습니다.
클래스는 대규모 데이터를 저장하고 참조해야 할 때 적합합니다. 참조 타입은 데이터를 힙에 저장하므로, 대규모 객체를 효율적으로 관리할 수 있습니다. 또한, 클래스는 상속을 지원하므로 복잡한 객체 지향 설계에 더 적합합니다.
클래스 사용 예시
- 복잡한 객체 모델링 (예: 사용자, 제품, 주문 등)
- 상속과 다형성을 이용한 설계
- 상태 변화가 잦고, 참조를 통한 객체 관리가 필요한 경우
구조체 사용 예시
- 좌표, 색상 등 작은 데이터를 처리할 때
- 상속이 필요 없는 단순한 데이터 구조
- 자주 생성되고 파괴되는 가벼운 데이터
【 결론 】
C#에서 클래스와 구조체는 각기 다른 목적을 가지고 설계되었습니다. 클래스는 참조 타입으로 대규모 데이터와 복잡한 객체 지향 프로그래밍에 적합하며, 구조체는 값 타입으로 단순하고 작은 데이터를 처리하는 데 적합합니다. 여러분의 프로젝트에 맞는 적절한 타입을 선택해 성능을 최적화하고, 유지보수성을 높이는 것이 중요합니다.
'개발💻 > C#' 카테고리의 다른 글
[C#] Span<T> vs Memory<T> (0) | 2025.01.18 |
---|---|
[C#] Dynamic 타입: 유연성과 주의점 (0) | 2024.11.30 |
[C#] readonly와 const의 차이 (0) | 2024.10.05 |
[C#] Coupling, Cohesion 1 (0) | 2024.08.10 |
[C#] Observer Pattern 1 (0) | 2024.07.13 |