반응형
구조체(struct)와 '값 타입 vs 참조 타입'
• C#은 Value Type과 Reference Type을 지원한다.
• C#에서는 struct를 사용하면 Value Type을 만들고, class 를 사용하면 Reference Type을 만든다.
• C# .NET의 기본 데이타형들은 struct로 정의되어 있다. 즉, int, double, float, bool 등의 기본 데이타 타입은 모두 struct로 정의된 Value Type이다. Value Type은 상속될 수 없으며, 주로 상대적으로 간단한 데이타 값을 저장하는데 사용된다. 반면에 Reference Type은 class를 정의하여 만들며 상속이 가능하고, 좀 더 복잡한 데이타와 행위들을 정의하는 곳에 많이 사용된다.
구조체의 특징
1. 값 타입 (Value Type)
2. 스택 메모리(Stack Memroy)에 할당
3. 매개변수로 전달 시 값이 복사
4. 생성자, 메서드, 프로퍼티를 가질 수 있다.
5. 상속을 지원하지 않는다.
1. 구조체 예시
public struct Point { public int X { get; set; } public int Y { get; set; } public Point(int x, int y) { X = x; Y = y; } }
2. 값 타입 vs 참조 타입
C#의 타입은 크게 값 타입과 참조 타입으로 나눌 수 있습니다.
값 타입 (Value Types)
• 직접 값을 저장
• 스택 메모리에 할당
• 복사 시 실제 값이 복사됨
• 예: int, float, bool, struct 등
참조 타입 (Reference Types)
• 값에 대한 참조(메모리 주소)를 저장
• 힙 메모리에 할당
• 복사 시 참조가 복사됨
• 예: class, interface, delegate, string 등
3. 값 타입(Value Type)과 참조 타입(Reference Type)의 차이점
• 메모리 할당
⸰ 값 타입: 스택 (Stack Memory)
⸰ 참조 타입: 힙 (Heap Memory)
• 복사 동작
⸰ 값 타입: 깊은 복사
⸰ 참조 타입: 얕은 복사
• 성능
⸰ 값 타입: 작은 데이터에 대해 더 효율적
⸰ 참조 타입: 큰 데이터나 복잡한 객체에 적합
• null 허용
⸰ 값 타입: 기본적으로 null을 가질 수 없음 (Nullable 타입 제외)
⸰ 참조 타입: null 가능
struct ValueTypeExample { public int Value; } class ReferenceTypeExample { public int Value; } class Program { static void Main() { // 값 타입 ValueTypeExample v1 = new ValueTypeExample { Value = 10 }; ValueTypeExample v2 = v1; v2.Value = 20; Console.WriteLine($"v1.Value: {v1.Value}, v2.Value: {v2.Value}"); // 출력: v1.Value: 10, v2.Value: 20 // 참조 타입 ReferenceTypeExample r1 = new ReferenceTypeExample { Value = 10 }; ReferenceTypeExample r2 = r1; r2.Value = 20; Console.WriteLine($"r1.Value: {r1.Value}, r2.Value: {r2.Value}"); // 출력: r1.Value: 20, r2.Value: 20 } }
• 값 타입(Value Type)의 파라미터 전달은 데이타를 복사(copy)하여 전달
• 참조 타입(Reference Type)은 Heap 상의 객체에 대한 레퍼런스(reference)를 전달
[정리하며]
구조체와 값 타입은 작은 크기의 데이터를 효율적으로 처리하는 데 유용하며, 참조 타입은 복잡한 객체나 큰 데이터를 다룰 때 적합합니다. 각 타입의 특성을 이해하고 상황에 맞게 적절히 사용하는 것이 중요합니다.
반응형
'Programming Languages > C# 기초문법' 카테고리의 다른 글
[C# 기초문법] Nullable (0) | 2024.09.06 |
---|---|
[C# 기초문법] 클래스 (class) (0) | 2024.09.06 |
[C# 기초문법] 네임스페이스 (namespace) (0) | 2024.09.04 |
[C# 기초문법] 예외처리 -2 (사용 예시) (0) | 2024.09.04 |
[C# 기초문법] 예외처리 -1 (try-catch, finally, throw) (0) | 2024.09.04 |