C#에서 데이터 타입은 크게 두 가지 범주로 나눌 수 있습니다: 값 타입(Value Type)과 참조 타입(Reference Type). 이 두 타입의 주된 차이는 데이터가 저장되는 위치와 데이터를 어떻게 할당하고 복사하는지에 있습니다.
값 타입(Value Type)
- 저장 장소: 값 타입은 데이터를 스택(Stack) 메모리에 직접 저장합니다.
- 저장 방식: 값 타입의 변수를 할당할 때는 해당 변수에 데이터의 실제 값이 저장됩니다.
- 해당 타입: 값 타입의 예로는 기본 데이터 타입(int, double, char 등), 구조체(struct), 그리고 열거형(enum)이 있습니다.
- 상속: 항상 System.ValueType 로부터 상속 받습니다.
특징:
- 값 타입의 변수를 다른 변수에 할당하면, 해당 값의 복사본이 생성되어 별도의 메모리 공간에 저장됩니다. 따라서 원본 변수와 복사본은 서로 독립적입니다.
- 값 타입은 메소드에 매개변수로 전달될 때도 복사되어 전달됩니다(값에 의한 전달).
예시:
int a = 10;
int b = a;
b = 20;
참조 타입(Reference Type)
- 저장 장소: 참조 타입은 데이터를 힙(Heap) 메모리에 저장합니다.
- 저장 방식: 변수에는 데이터가 저장된 힙의 주소(참조)가 저장됩니다.
- 해당 타입: 참조 타입의 예로는 클래스(class), 배열(array), 대리자(delegate), 인터페이스(interface) 등이 있습니다.
- 상속: 항상 System.ObjectType 로부터 상속 받습니다.
특징:
- 참조 타입의 변수를 다른 변수에 할당하면, 힙 메모리 주소의 참조가 복사됩니다. 따라서 두 변수는 같은 객체를 참조하게 됩니다.
- 참조 타입은 메소드에 매개변수로 전달될 때 참조가 전달됩니다(참조에 의한 전달). 이는 메소드 내에서 객체의 상태가 변경될 경우 원본 객체에도 그 변경사항이 반영된다는 것을 의미합니다.
예시:
class MyClass {
public int Value { get; set; }
}
MyClass c1 = new MyClass();
c1.Value = 10;
MyClass c2 = c1;
c2.Value = 20;
성능과 사용
- 값 타입은 작은 크기의 데이터를 빠르게 복사하고 처리할 때 유용합니다. 스택 메모리를 사용하기 때문에 가비지 컬렉션의 부하가 적습니다.
- 참조 타입은 크기가 크거나 복잡한 객체를 관리할 때 적합합니다. 힙 메모리를 사용하므로, 메모리 관리는 가비지 컬렉터가 담당하게 됩니다.