Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# 데이터 타입의 3가지 종류: 값 형식, 참조 형식, 포인터 형식 총정리

C#은 강력한 타입 시스템을 갖춘 프로그래밍 언어로, 변수를 선언할 때 반드시 해당 변수의 타입을 지정해야 합니다. C#에서 사용되는 타입은 크게 값 형식(Value Type), 참조 형식(Reference Type), 포인터 형식(Pointer Type) 세 가지로 나눌 수 있습니다.

각 타입이 메모리에 저장되는 방식과 동작 방식이 서로 다르기 때문에, 이 차이를 정확히 이해하는 것이 안전하고 효율적인 C# 코드를 작성하는 데 매우 중요합니다. 아래에서 각 타입의 특징을 자세히 살펴보겠습니다.

1. 값 형식 (Value Types)

값 형식 변수에는 데이터가 직접 할당됩니다. 즉, 변수 자체에 실제 값이 저장되며, 모든 값 형식은 System.ValueType 클래스에서 파생됩니다.

값 형식은 데이터를 직접 포함하고 있습니다. 대표적인 예로 정수를 저장하는 int, 문자 하나를 저장하는 char, 부동 소수점 숫자를 저장하는 float 등이 있습니다. 예를 들어 int 타입의 변수를 선언하면, 시스템은 해당 값을 저장하기 위한 메모리 공간을 즉시 할당합니다.

주요 값 형식으로는 다음과 같은 것들이 있습니다.

  • 정수형: int, long, short, byte 등
  • 부동 소수점형: float, double, decimal
  • 문자형: char
  • 논리형: bool
  • 구조체(struct)와 열거형(enum)

값 형식 변수를 다른 변수에 할당하면 데이터가 복사되어 전달되므로, 원본 변수와 복사본은 서로 독립적으로 동작합니다.

2. 참조 형식 (Reference Types)

참조 형식은 변수에 실제 데이터를 직접 저장하지 않습니다. 대신 실제 데이터가 저장된 메모리 위치(힙 영역)에 대한 참조(reference), 즉 주소를 저장합니다.

대표적인 참조 형식은 다음과 같습니다.

  • 클래스(class): 사용자 정의 객체 타입
  • 문자열(string): 불변(immutable) 문자 시퀀스
  • 배열(array): 동일한 타입 요소들의 집합
  • 인터페이스(interface), 델리게이트(delegate), object

참조 형식 변수를 다른 변수에 할당하면 데이터 자체가 아니라 참조 주소만 복사되기 때문에, 두 변수는 같은 객체를 가리키게 됩니다. 따라서 한쪽에서 객체의 내용을 변경하면 다른 쪽에서도 그 변경 사항이 그대로 반영됩니다.

3. 포인터 형식 (Pointer Types)

포인터 형식 변수는 다른 타입의 데이터가 저장된 메모리 주소를 저장합니다. C#의 포인터는 C 또는 C++ 언어의 포인터와 거의 동일한 기능을 제공합니다.

다만 C#에서 포인터를 사용하려면 코드 블록을 unsafe 키워드로 표시해야 하며, 프로젝트 설정에서 '안전하지 않은 코드 허용' 옵션을 활성화해야 합니다. 이는 포인터가 메모리를 직접 조작할 수 있어 잠재적으로 위험할 수 있기 때문입니다.

unsafe
{
    int number = 10;
    int* ptr = &number; // number 변수의 메모리 주소를 저장
    Console.WriteLine(*ptr); // 출력 결과: 10
}

마무리: 값 형식 vs 참조 형식 비교

구분값 형식참조 형식
데이터 저장 위치스택(Stack)힙(Heap)
변수에 저장되는 값실제 데이터데이터의 메모리 주소
할당 시 동작값이 복사됨참조 주소가 복사됨
기본값타입별 기본값 (예: int → 0)null
대표 예시int, char, float, structclass, string, array

C#의 타입 시스템을 제대로 이해하면 메모리 사용을 최적화하고, 버그를 줄이며, 더 견고한 애플리케이션을 개발할 수 있습니다. 값 형식과 참조 형식의 차이를 항상 염두에 두고 코딩하시기 바랍니다.