값 형식 & 참조형식 (Value Type & Reference Type)
지금까지 사용하던 프로그래밍 언어와 달리 C#에는 값 형식과 참조 형식이라는 두 가지 데이터 형식이 있습니다. 응용 프로그램의 성능이 중요하거나 C#의 데이터 및 메모리 관리 방식에 관심이 있는 경우에는 두 형식의 차이점을 알아야 합니다.
C# 형식은 참조 형식과 값 형식 두 가지가 있습니다.
값 형식 (Value Type)
값 형식을 기반으로 한 변수에는 값이 직접 포함됩니다. 값 형식 변수 하나를 다른 변수에 대입하면 변수에 포함된 값이 복사됩니다.
이는 참조 형식 변수를 대입하는 경우와 다릅니다. 참조 형식 변수의 경우 개체 자체가 아니라 개체에 대한 참조가 복사됩니다. 모든 값 형식은 암시적으 System.ValueType에서 파생됩니다. 참조 형식과 달리 값 형식에서는 새 형식을 파생시킬 수 없습니다. 그러나 구조체는 참조 형식과 마찬가지로 인터페이스를 구현할 수 있습니다. 참조 형식과 달리 값 형식에는 null 값이 포함될 수 없습니다.
값 형식은 기본적으로 구조체와 열거형으로 구분할 수 있습니다.
또 여기서 구조체는 숫자(정수 , 부동 소수점 , decimal ) , bool , 사용자 정의 구조체로 구분 할 수 있습니다.
값 형식은 스택에 할당된 메모리에 내용을 저장합니다.
아래 경우에는 스택이라는 메모리 영역에 값 7이 저장됩니다.
void TestMethod()
{
int number = 7;
}
변수가 정의된 메서드의 실행이 종료되어 변수가 범위를 벗어나면 값이 스택에서 삭제됩니다.
참조 형식 ( Reference Type)
참조 형식의 변수에는 데이터(개체)에 대한 참조가 저장되며, 값 형식의 변수에는 해당 데이터가 직접 포함됩니다. 참조 형식에서는 두 가지 변수가 같은 개체를 참조할 수 있으므로 한 변수에 대한 작업이 다른 변수에서 참조하는 개체에 영향을 미칠 수 있습니다. 값 형식에서는 각 변수에 데이터의 자체 사본이 들어 있으며 한 변수의 작업이 다른 변수에 영향을 미칠 수 없습니다
참조 형식으로는 클래스 , 인터페이스 , 델리게이트가 있으며,
기본적으로 다이나믹 , 오브잭트 , 스트링의 기본 참조 형식도 제공하고 있습니다.
스택을 사용하면 효율적이지만 값 형식의 수명이 제한되므로 서로 다른 클래스 간에 데이터를 공유하는 데는 적합하지 않습니다.
반대로 클래스 또는 배열의 인스턴스와 같은 참조 형식은 힙이라는 다른 메모리 영역에 할당됩니다.
아래 배열을 구성하는 10개의 정수에 필요한 공간이 힙에 할당됩니다.
int[] numbers = new int[10];
이 메모리는 메서드가 종료되어도 힙에 반환되지 않으며, C#의 가비지 수집 시스템에서 이 메모리가 더 이상 필요하지 않다고 판단할 때에만 회수됩니다. 참조 형식을 선언하면 오버헤드가 커지지만 참조 형식은 다른 클래스에서 액세스할 수 있다는 장점이 있습니다.
데이터를 값 형식 매개 변수로 메서드에 전달하면 스택에 각 매개 변수의 복사본이 만들어집니다. 따라서 해당 매개 변수가 많은 요소가 있는 사용자 정의 구조체와 같은 큰 데이터 형식이거나 메서드가 여러 번 실행되는 경우 성능에 영향을 줄 수 있습니다.
[참고]
값 형식 및 참조 형식 [MSDN]
https://msdn.microsoft.com/ko-kr/library/4d43ts61(v=vs.90).aspx
'프로그래밍 > C#' 카테고리의 다른 글
[C#] IEnumerable , IEnumerator 인터페이스 (0) | 2016.09.29 |
---|---|
[C#] 람다식 (lambda) - 1 (0) | 2016.09.25 |
[C#] 대리자 (Delegate) - 델리게이트 (0) | 2016.09.25 |
[C#] 박싱 & 언박싱 (Boxing & UnBoxing) (0) | 2016.09.25 |
[C#] 기본 - 네임 스페이스 , 메소드 (0) | 2016.04.05 |