C#의 값 타입과 참조 타입
값 타입 (Value Types)
값 타입은 데이터를 직접 저장합니다. 일반적으로 이는 스택(Stack) 메모리 영역에 저장되며, 주로 크기가 작고 수명이 짧은 데이터에 적합합니다.
다만, 값 타입이 참조 타입의 필드로 사용될 때는 해당 객체와 함께 힙 메모리에 저장될 수도 있습니다.
- 기본 데이터 타입:
int
,float
,double
,char
,bool
- 구조체:
struct
- 열거형:
enum
특징
- 데이터 저장 방식: 값 타입 변수는 실제 데이터 값을 직접 저장합니다.
- 메모리 할당: 값 타입 변수는 스택 메모리에 할당됩니다. 함수나 메소드가 종료되면 스택에 할당된 메모리는 자동으로 해제됩니다.
- 복사: 값 타입 변수를 다른 변수에 할당하면, 실제 데이터 값이 복사됩니다. 즉, 두 변수는 독립적인 값을 가지며 한 변수를 변경해도 다른 변수에는 영향을 미치지 않습니다.
예시
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
특징
- 데이터 저장 방식: 참조 타입 변수는 데이터가 저장된 메모리 주소를 저장합니다.
- 메모리 할당: 참조 타입 변수는 힙 메모리에 할당되며, 가비지 컬렉터(Garbage Collector)에 의해 메모리가 관리됩니다.
- 복사: 참조 타입 변수를 다른 변수에 할당하면, 실제 데이터가 아닌 메모리 주소가 복사됩니다. 따라서 두 변수는 동일한 데이터를 참조하며, 한 변수를 통해 데이터를 변경하면 다른 변수에도 영향을 미칩니다.
예시
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"
주요 차이점 정리
- 값 타입은 데이터를 직접 저장하고, 스택 메모리에 할당되며, 복사 시 독립적인 복사본을 만듭니다.
- 참조 타입은 데이터 참조를 저장하고, 힙 메모리에 할당되며, 복사 시 동일한 데이터를 참조하게 됩니다.
참고
이 기사는 저작권자의 CC BY-NC-ND 4.0 라이센스를 따릅니다.