C#에서 변수는 크게 값 형식(Value Type)과 참조 형식(Reference Type) 두 가지로 나뉩니다. 두 형식은 데이터를 저장하고 다루는 방식에서 근본적인 차이가 있으며, 메모리 관리와 프로그램 성능에도 중요한 영향을 미칩니다.
값 형식(Value Type)
값 형식 변수에는 값을 직접 할당할 수 있습니다. 모든 값 형식은 System.ValueType 클래스에서 파생되며, 변수 자체에 실제 데이터가 직접 포함됩니다. 예를 들어 int 타입의 변수를 선언하면 시스템은 해당 값을 저장하기 위한 메모리를 즉시 할당합니다.
값 형식 변수는 스택(Stack) 영역에 저장됩니다. 스택은 접근 속도가 빠르고 변수 범위(scope)를 벗어나면 자동으로 해제되는 특성이 있어, 작고 단순한 데이터를 다룰 때 효율적입니다.
대표적인 값 형식 예시
- int — 정수형 숫자를 저장합니다.
- char — 하나의 문자(알파벳 등)를 저장합니다.
- float — 부동 소수점 숫자를 저장합니다.
이 외에도 bool, double, decimal, 구조체(struct) 등이 값 형식에 해당합니다.
참조 형식(Reference Type)
참조 형식은 변수가 데이터 자체가 아니라 메모리 위치(주소)를 참조하는 방식으로 동작합니다. 여러 변수가 동일한 메모리 위치를 참조할 수 있는데, 이때 한 변수가 해당 메모리의 데이터를 변경하면 그 위치를 참조하는 다른 변수들도 자동으로 변경된 값을 반영하게 됩니다. 즉, 복사본이 아닌 원본 데이터를 함께 바라보게 되는 것입니다.
참조 형식 변수는 힙(Heap) 영역에 저장되며, 실제 데이터는 힙에 존재하고 변수에는 그 주소만 담기게 됩니다. 힙은 가비지 컬렉터(GC)에 의해 관리되므로, 더 이상 참조되지 않는 객체는 자동으로 메모리에서 해제됩니다.
C#에서 제공하는 기본 참조 형식
- object — 모든 타입의 최상위 기반 클래스로, 어떤 데이터든 담을 수 있습니다.
- dynamic — 컴파일 시점이 아닌 런타임에 타입 검사가 수행되는 동적 타입입니다.
- string — 문자열을 다루며, 불변(immutable)이라는 특징이 있습니다.
두 형식의 핵심 차이 요약
- 저장 방식: 값 형식은 데이터를 직접 저장하고, 참조 형식은 데이터가 있는 메모리 주소를 저장합니다.
- 메모리 위치: 값 형식은 스택에, 참조 형식은 힙에 저장됩니다.
- 할당 동작: 값 형식은 복사 시 값 자체가 복사되고, 참조 형식은 같은 메모리를 가리키므로 한쪽의 변경이 다른 쪽에 영향을 줍니다.
값 형식과 참조 형식의 차이를 정확히 이해하면 불필요한 메모리 복사를 줄이고, 참조 공유로 인한 의도치 않은 버그를 예방할 수 있습니다. C# 프로그래밍에서 안정적이고 효율적인 코드를 작성하기 위한 필수 개념이니 꼭 숙지해 두세요.