포스트

C#의 값 타입과 참조 타입

값 타입 (Value Types)

값 타입은 데이터를 직접 저장합니다. 일반적으로 이는 스택(Stack) 메모리 영역에 저장되며, 주로 크기가 작고 수명이 짧은 데이터에 적합합니다.

다만, 값 타입이 참조 타입의 필드로 사용될 때는 해당 객체와 함께 힙 메모리에 저장될 수도 있습니다.

  • 기본 데이터 타입: int, float, double, char, bool
  • 구조체: struct
  • 열거형: enum

특징

  1. 데이터 저장 방식: 값 타입 변수는 실제 데이터 값을 직접 저장합니다.
  2. 메모리 할당: 값 타입 변수는 스택 메모리에 할당됩니다. 함수나 메소드가 종료되면 스택에 할당된 메모리는 자동으로 해제됩니다.
  3. 복사: 값 타입 변수를 다른 변수에 할당하면, 실제 데이터 값복사됩니다. 즉, 두 변수는 독립적인 값을 가지며 한 변수를 변경해도 다른 변수에는 영향을 미치지 않습니다.

예시

1
2
3
4
5
int a = 10;
int b = a; // a의 값을 b에 복사
b = 20;    // b의 값을 변경해도 a는 영향을 받지 않음
Console.WriteLine(a); // 10
Console.WriteLine(b); // 20

참조 타입 (Reference Types)

참조 타입은 데이터를 직접 저장하는 대신 데이터가 저장된 메모리 위치를 가리키는 참조를 저장합니다.

이는 힙(Heap) 메모리 영역에 저장되며, 주로 크기가 크고 수명이 긴 데이터에 적합합니다.

다만, 특정 최적화나 실행 컨텍스트에 따라 임시로 스택에 저장될 수도 있습니다.

  • 배열: array
  • 클래스: class, object, string
  • 인터페이스: interface
  • 델리게이트: delegate

특징

  1. 데이터 저장 방식: 참조 타입 변수는 데이터가 저장된 메모리 주소를 저장합니다.
  2. 메모리 할당: 참조 타입 변수는 힙 메모리에 할당되며, 가비지 컬렉터(Garbage Collector)에 의해 메모리가 관리됩니다.
  3. 복사: 참조 타입 변수를 다른 변수에 할당하면, 실제 데이터가 아닌 메모리 주소가 복사됩니다. 따라서 두 변수는 동일한 데이터를 참조하며, 한 변수를 통해 데이터를 변경하면 다른 변수에도 영향을 미칩니다.

예시

1
2
3
4
5
6
7
8
9
class Person
{
    public string Name { get; set; }
}

Person person1 = new Person { Name = "Alice" };
Person person2 = person1; // person1의 참조를 person2에 복사
person2.Name = "Bob";     // person2를 통해 데이터를 변경
Console.WriteLine(person1.Name); // "Bob"

주요 차이점 정리

  • 값 타입은 데이터를 직접 저장하고, 스택 메모리에 할당되며, 복사 시 독립적인 복사본을 만듭니다.
  • 참조 타입은 데이터 참조를 저장하고, 힙 메모리에 할당되며, 복사 시 동일한 데이터를 참조하게 됩니다.

참고

메모리 구조 (Memory Structure)

이 기사는 저작권자의 CC BY-NC-ND 4.0 라이센스를 따릅니다.