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

C# 비관리 코드(Unmanaged Code)란? 개념부터 unsafe 키워드 활용까지

C#에서 비관리 코드(Unmanaged Code)는 공용 언어 런타임(CLR)의 완전한 관리·제어를 받지 않는 코드를 의미합니다. 일반적인 C# 코드가 가비지 컬렉션, 타입 안정성 검사 등 CLR의 다양한 안전장치 속에서 실행되는 반면, 비관리 코드는 이러한 관리 범위를 벗어나 메모리 주소에 직접 접근할 수 있습니다.

비관리 코드의 주요 특징

  • CLR의 제어를 받지 않는 애플리케이션이 비관리 코드에 해당합니다.
  • 비관리 코드(또는 안전하지 않은 코드, Unsafe Code)는 포인터 변수를 사용하는 코드 블록을 말합니다.
  • unsafe 한정자(modifier)를 사용하면 비관리 코드 내에서 포인터 연산이 허용됩니다.

포인터는 메모리 주소를 직접 다루기 때문에 강력하지만 위험할 수 있습니다. 따라서 C#에서는 기본적으로 포인터 사용이 금지되어 있으며, unsafe 키워드로 명시적으로 선언된 영역에서만 허용됩니다. 참고로 프로젝트 설정에서 /unsafe 컴파일 옵션을 활성화해야 정상적으로 빌드됩니다.

포인터 변수 선언 및 사용 예제

다음 예제는 unsafe 한정자를 사용하여 포인터 변수를 선언하고, 변수의 값과 해당 메모리 주소를 출력하는 방법을 보여줍니다.

static unsafe void Main(string[] args) {
    int var = 20;
    int* p = &var;

    Console.WriteLine("Data is: {0} ", var);
    Console.WriteLine("Address is: {0}", (int)p);
    Console.ReadKey();
}

코드 설명

  • int var = 20; — 정수형 변수를 선언하고 20으로 초기화합니다.
  • int* p = &var; — 주소 연산자(&)를 사용해 변수 var의 메모리 주소를 포인터 p에 저장합니다.
  • (int)p — 포인터가 가리키는 메모리 주소 값을 콘솔에 출력합니다.

실행 결과로 변수의 데이터 값인 20과 함께, 해당 변수가 저장된 메모리 주소가 함께 출력되는 것을 확인할 수 있습니다. 이처럼 비관리 코드는 하드웨어 수준의 저수준 프로그래밍이 필요한 경우에 유용하게 활용됩니다.