본문 바로가기
프로그래밍/C#

C# 값 타입과 참조 타입의 차이

by argentdarae 2025. 3. 4.
반응형

C#의 값 타입과 참조 타입은 메모리에 데이터를 저장하는 방식과 저장된 데이터에 접근하는 방식이 다르다

 

메모리 저장 방식

저장 방식의 차이로 인해 메모리 할당 속도, 기본 초기화 값 등의 차이가 발생한다

 

값 타입의 데이터는 일반적으로 스택 영역에 저장되고, 참조 타입의 필드로 사용될 경우 힙에 저장된다. 변수에 데이터가 그대로 저장된다

using System;

class Program
{
    static void Main()
    {
        int a = 10;  // 값 타입 (스택에 저장됨)
        int b = a;   // a의 값을 복사하여 b에 저장 (새로운 공간 할당)
        b = 20;      // b만 변경, a에는 영향 없음

        Console.WriteLine($"a: {a}");  // 10
        Console.WriteLine($"b: {b}");  // 20
    }
}


================ 실행 결과 ================
a: 10
b: 20

 

참조 타입의 데이터는 힙에 저장되며 변수에는 힙에 저장된 데이터의 위치를 가리키는 메모리 주소가 저장된다. 포인터의 개념과 유사하다

using System;

class Sample
{
    public int Value;
}

class Program
{
    static void Main()
    {
        Sample obj1 = new Sample(); // 참조 타입 (힙에 저장됨)
        obj1.Value = 10;

        Sample obj2 = obj1;  // obj1의 참조(메모리 주소)가 obj2에 복사됨 (같은 객체를 참조)
        obj2.Value = 20;      // obj2를 변경하면 obj1도 영향을 받음

        Console.WriteLine($"obj1.Value: {obj1.Value}");  // 20
        Console.WriteLine($"obj2.Value: {obj2.Value}");  // 20
    }
}


================ 실행 결과 ================
obj1.Value: 20
obj2.Value: 20

 

 

결론

C#의 값 타입과 참조 타입은 메모리에 데이터를 저장하는 방식과 저장된 데이터에 접근하는 방식이 다르다

 

값 타입의 데이터는 일반적으로 스택 영역에 저장되고, 참조 타입의 필드로 사용될 경우 힙에 저장된다. 그리고 변수에 데이터가 그대로 저장된다

 

참조 타입의 데이터는 힙에 저장되며 변수에는 힙에 저장된 데이터의 위치를 가리키는 메모리 주소가 저장된다