컴퓨터는 모든 데이터를 메모리에 저장한다. 그런데 이 데이터를 저장하고 사용하는 방식에는 두 가지 큰 차이가 있다.
이 두 개념을 잘 알아야 성능 좋은 코드, 버그 없는 코드, 효율적인 메모리 사용이 가능해진다.
int a = 5;
int b = a;
b = 10;
Console.WriteLine(a); // 5
Console.WriteLine(b); // 10
a와b는 서로 독립적인 값
class Person
{
public string Name;
}
Person p1 = new Person();
p1.Name = "Alice";
Person p2 = p1;
p2.Name = "Bob";
Console.WriteLine(p1.Name); // Bob
Console.WriteLine(p2.Name); // Bob
[Stack] [Heap]
p1 ─────┐ ┌────────────┐
└────> │ Person │
│ Name: Bob │
p2 ──────────> └────────────┘
p1과p2는 같은 것을 가리키고 있다(주소 복사)
| 항목 | 값 타입 | 참조 타입 |
|---|---|---|
| 저장 위치 | 스택 | 힙 |
| 복사 방식 | 값 복사 | 주소 복사 |
| 서로 독립적인가? | 네 | 아니요 (같은 객체 공유) |
| 기본 예시 | int, float | class, array, string |
struct Car
{
public int Speed;
public Engine EngineRef;
}
Speed는 값 타입 → 스택에 저장됨EngineRef는 참조 타입 → 힙에 저장됨