C#은 기본적으로 메모리를 자동으로 관리하는 안전한 언어이지만, 때로는 포인터를 직접 다루어야 하는 저수준 프로그래밍이 필요할 수 있습니다. 이때 사용되는 것이 바로 안전하지 않은 코드(Unsafe Code)와 비관리 코드(Unmanaged Code)입니다.
비관리 코드(Unmanaged Code)란?
CLR(공용 언어 런타임, Common Language Runtime)의 제어 범위 밖에서 실행되는 애플리케이션 코드를 비관리 코드라고 합니다. CLR은 가비지 컬렉션, 타입 안정성 검사 등 메모리 관리를 담당하지만, 비관리 코드는 이러한 관리 대상에서 벗어나 있습니다.
안전하지 않은 코드(Unsafe Code)란?
안전하지 않은 코드란 포인터 변수를 사용하여 메모리 주소에 직접 접근할 수 있도록 허용하는 코드 블록을 의미합니다. 일반적인 C# 코드에서는 포인터 사용이 금지되어 있지만, unsafe 키워드를 선언하면 포인터 연산이 가능해집니다.
다음은 unsafe 키워드를 활용한 예제 코드입니다.
static unsafe void Main(string[] args) {
int x = 100;
int* a = &x;
Console.WriteLine("Data : {0} ", x);
Console.WriteLine("Address : {0}", (int)a);
Console.ReadKey();
}코드 설명
위 예제에서 변수 x에 값 100을 저장한 후, 포인터 변수 a가 x의 메모리 주소를 참조합니다. 이후 Console.WriteLine을 통해 변수의 실제 데이터와 해당 메모리 주소 값을 출력합니다.
이처럼 안전하지 않은 코드는 성능 최적화나 하드웨어 직접 제어가 필요한 특수한 상황에서 유용하게 사용되지만, 메모리 오류의 위험이 있으므로 신중하게 사용해야 합니다.