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과 함께, 해당 변수가 저장된 메모리 주소가 함께 출력되는 것을 확인할 수 있습니다. 이처럼 비관리 코드는 하드웨어 수준의 저수준 프로그래밍이 필요한 경우에 유용하게 활용됩니다.