다음을 통해 공유


안전한 코드와 안전하지 않은 코드(C# 및 Java)

업데이트: 2007년 11월

C#의 특히 중요한 기능 중 하나는 형식이 안전하지 않은 코드에 대한 지원입니다. 일반적으로 CLR(공용 언어 런타임)에서는 MSIL(Microsoft Intermediate Language) 코드의 동작을 감독하고 의심스러운 작업을 미연에 방지합니다. 그러나 경우에 따라서는 Win32 API 호출 같은 하위 수준 기능에 직접 액세스해야 할 수도 있고 그러한 코드가 올바르게 작동하는 것이 확실하다면 이를 실제로 수행할 수 있습니다. 이러한 코드는 소스 코드에서 안전하지 않은 블록 안에 배치해야 합니다.

unsafe 키워드

하위 수준 API를 호출하거나 산술 포인터를 사용하거나 기타 의심스러운 작업을 수행하는 C# 코드는 unsafe 키워드로 표시된 블록 안에 배치해야 합니다. 다음은 안전하지 않은 것으로 표시할 수 있는 항목입니다.

  • 전체 메서드

  • 중괄호의 코드 블록

  • 개별 문

다음 예제에서는 위와 같은 세 가지 상황 모두에 unsafe를 사용하는 경우를 보여 줍니다.

class TestUnsafe
{
    unsafe static void PointyMethod()
    {
        int i=10;

        int *p = &i;
        System.Console.WriteLine("*p = " + *p);
        System.Console.WriteLine("Address of p = {0:X2}\n", (int)p);
    }

    static void StillPointy()
    {
        int i=10;

        unsafe
        {
            int *p = &i;
            System.Console.WriteLine("*p = " + *p);
            System.Console.WriteLine("Address of p = {0:X2}\n", (int)p);
        }
    }

    static void Main()
    {
        PointyMethod();
        StillPointy();
    }
}

이 코드에서 전체 PointyMethod() 메서드는 포인터를 선언하고 사용하므로 안전하지 않은 것으로 표시됩니다. StillPointy() 메서드는 코드 블록을 안전하지 않은 것으로 표시합니다. 이 블록에서 다시 포인터를 사용하기 때문입니다.

fixed 키워드

안전한 코드에서 가비지 수집기는 그 임무에 따른 수명이 지속되는 동안 매우 자유롭게 개체를 이동하여 여유 리소스를 정리하고 압축합니다. 그러나 코드에서 포인터를 사용하는 경우 이러한 동작은 예기치 않은 결과를 낳을 수 있으므로 특정 개체를 옮기지 않도록 fixed 문를 사용하여 가비지 수집기에 지시할 수 있습니다.

다음 코드에서는 PointyMethod() 메서드의 코드 블록을 실행하는 동안 시스템에서 배열을 옮기지 않도록 지시하는 데 사용되는 fixed 키워드를 보여 줍니다. fixed는 안전하지 않은 코드 내에서만 사용됩니다.

class TestFixed
{
    public static void PointyMethod(char[] array)
    {
        unsafe
        {
            fixed (char *p = array)
            {
                for (int i=0; i<array.Length; i++)
                {
                    System.Console.Write(*(p+i));
                }
            }
        }
    }

    static void Main()
    {
        char[] array = { 'H', 'e', 'l', 'l', 'o' };
        PointyMethod(array);
    }
}

참고 항목

작업

안전하지 않은 코드 샘플

개념

C# 프로그래밍 가이드

참조

안전하지 않은 코드 및 포인터(C# 프로그래밍 가이드)

기타 리소스

Java 개발자를 위한 C# 프로그래밍 언어