반응형
C#에서 struct와 class는 객체를 정의하는 데 사용되지만, 중요한 차이점이 있으며 각각 특정 상황에서 적합합니다. 이를 비교하고 언제 사용하는 것이 유리한지 설명하겠습니다.
1. 주요 차이점
특성 Struct Class
기본 형식 | 값 형식 (Value Type) | 참조 형식 (Reference Type) |
메모리 할당 | 스택(Stack) | 힙(Heap) |
복사 방식 | 값 복사 (deep copy) | 참조 복사 (shallow copy) |
상속 | 상속 불가 | 상속 가능 |
기본 생성자 | 기본 생성자를 정의할 수 없음 | 기본 생성자를 정의할 수 있음 |
Null 가능성 | 기본적으로 Null이 될 수 없음 | Null 값을 가질 수 있음 |
변경 가능성 | 기본적으로 불변 (Immutable) | 가변적 (Mutable) |
2. Struct를 사용하는 경우
- 가벼운 데이터 구조
- 메모리 사용량이 작고, 간단한 데이터 저장소 역할을 하는 경우 (ex. Point, Color 등).
- 성능이 중요한 경우 스택 메모리를 사용하므로 힙 할당 및 가비지 컬렉션 오버헤드를 줄일 수 있습니다.
- 불변 객체
- 값 복사를 통해 데이터를 보호해야 하는 상황에 유리합니다.
- 기본적으로 immutable 객체로 설계하기 적합합니다.
- 값 중심의 비교
- 값 기반의 동등성을 주로 다루는 경우 사용합니다.
Struct 예시
public struct Point
{
public int X { get; }
public int Y { get; }
public Point(int x, int y)
{
X = x;
Y = y;
}
}
3. Class를 사용하는 경우
- 복잡한 데이터 구조
- 많은 속성, 메서드, 복잡한 동작이 포함된 객체를 정의할 때 유리합니다.
- 힙 메모리를 사용하여 큰 데이터를 효율적으로 처리할 수 있습니다.
- 가변 객체
- 객체 상태가 변경될 수 있는 상황에서 적합합니다.
- 상속 및 다형성
- 상속, 인터페이스 구현 등 객체 지향 프로그래밍(OOP)을 활용해야 할 때 사용합니다.
- 참조 기반 데이터 공유
- 객체를 여러 곳에서 참조로 공유할 필요가 있을 때 유리합니다.
Class 예시
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public void Greet()
{
Console.WriteLine($"Hello, my name is {Name}");
}
}
4. Struct vs Class 사용 사례 비교
사용 사례 Struct를 사용 Class를 사용
좌표나 크기 표현 | 2D/3D 좌표, 벡터, 크기 등 | 복잡한 좌표 연산 클래스 |
설정 값 저장 | 설정 값의 스냅샷 | 설정 변경 및 관리 클래스 |
네트워크 패킷 | 간단한 데이터 패킷 구조체 | 패킷 처리 논리를 포함한 복잡한 클래스 |
게임 엔진 개발 | 위치, 회전, 크기 등의 값 형식 객체 | 엔티티 관리 및 동작 클래스 |
5. 성능 관련 고려사항
- Struct는 크기가 작고 불변일 때 성능상의 이점이 있지만, 크기가 너무 큰 Struct는 오히려 성능에 부정적인 영향을 줄 수 있습니다.
예를 들어, 큰 Struct를 메서드 매개변수로 전달하거나 반환할 때 값 복사가 많은 비용을 유발할 수 있습니다. - Class는 참조를 통해 데이터 공유가 가능하므로, 데이터 복사가 빈번한 경우 더 효율적입니다.
6. 결론
- Struct는 가볍고, 불변하며, 간단한 데이터 표현에 적합합니다.
- Class는 복잡한 동작, 상태 변경, 상속 구조가 필요한 상황에 적합합니다.
필요에 따라 값 복사와 참조 복사의 차이, 메모리 사용량, 성능 요구 사항 등을 고려하여 선택하세요.
반응형
'C#' 카테고리의 다른 글
C# 람다식: 간결하고 강력한 익명 함수 이해하기 (0) | 2025.01.13 |
---|---|
C# LINQ: 데이터 쿼리를 간결하고 강력하게 다루는 방법 (0) | 2025.01.13 |
SocketException: '각 소켓 주소는 하나만 사용할 수 있습니다' 에러 원인 및 해결법 (1) | 2025.01.10 |
C# internal: 어셈블리 내 접근 제한자 (0) | 2025.01.10 |
재미로 만드는 로또 번호 생성기 #2_로또 API를 이용해서 당첨 번호 조회하기. (3) | 2025.01.05 |
재미로 만드는 로또 번호 생성기 #1_중복 없는 번호 생성 (1) | 2025.01.04 |
C#의 Garbage Collection (GC) 개념 (5) | 2025.01.03 |
C#로 특정 폴더 내 파일 이름 변경 (1) | 2025.01.03 |