반응형
구조체와 클래스는 C#에서 각각 값 타입과 참조 타입으로 다르게 동작한다.
구조체와 클래스의 메모리 기본적인 메모리 할당은 구조체는 스택, 클래스는 항상 힙에 할당이 된다.
아래의 코드를 보면 MyStruct는 MyClass를 멤버 변수로 가지고 있다.
구조체의 ReferenceType는 스택에 올라갈까? 그렇지 않다.
classInstance는 힙에 할당되고 structInstance는 스택에 할당된다. 구조체의 ReferenceType는 힙에 할당되어 있는 classInstance를 참조하게 된다.
public class MyClass
{
public int Value { get; set; }
public MyClass(int value)
{
Value = value;
}
}
public struct MyStruct
{
public MyClass ReferenceType { get; set; }
public int Number { get; set; }
public MyStruct(int number, MyClass referenceType)
{
Number = number;
ReferenceType = referenceType;
}
}
void Main()
{
MyClass classInstance = new MyClass(100);
MyStruct structInstance = new MyStruct(10, classInstance);
Console.WriteLine($"Number: {structInstance.Number}, Value: {structInstance.ReferenceType.Value}");
structInstance.ReferenceType.Value = 200;
Console.WriteLine($"Updated Value: {classInstance.Value}"); // 200
}
구조체는 스택에 생성, class는 힙에 생성 라는 생각에 매몰되어 오해할 수 있는데 클래스의 맴버 변수이기 때문에 classInstance의 힙 메모리 내에 직접 할당이 된다.
public struct MyStruct
{
public int X;
public int Y;
}
public class MyClass
{
public MyStruct Position;
}
void Main()
{
MyClass classInstance = new MyClass();
classInstance.Position = new MyStruct { X = 10, Y = 20 };
Console.WriteLine($"X: {classInstance.Position.X}, Y: {classInstance.Position.Y}");
}
최종 정리를 하자면
- 구조체는 스택에, 클래스는 힙에 할당된다는 일반적인 규칙이 맞지만, 구조체가 클래스의 멤버로 포함될 때는 예외가 있다.
- 구조체가 클래스를 멤버로 가지는 경우, 구조체는 스택에 할당되더라도, 해당 구조체의 참조 타입 멤버는 힙에 할당된 클래스를 참조한다.
- 클래스가 구조체를 멤버로 가지는 경우, 구조체는 클래스와 함께 힙에 할당된다.
반응형
'개발관련 > C#' 카테고리의 다른 글
IAsyncStateMachine 과 Task (1) | 2024.09.02 |
---|---|
Task 사용 시의 흐름 (0) | 2024.09.02 |
Dictionary 와 HashTable, SortedDictionary 차이 (0) | 2024.08.30 |
리플렉션(Reflection)과 표현식 트리(Expression Tree) (0) | 2023.10.15 |
System.IO.Pipelines (0) | 2023.02.08 |