Share via


out(C# 참조)

out 컨텍스트 키워드는 두 가지 컨텍스트, 즉 매개 변수 한정자로 사용하거나 인터페이스와 대리자의 제네릭 형식 매개 변수 선언에서 사용할 수 있습니다. 각 항목은 상세한 정보를 확인할 수 있는 링크입니다. 이 항목에서는 매개 변수 한정자에 대해 설명하며, 이 항목에서 제네릭 형식 매개 변수 선언에 대한 정보를 확인할 수 있습니다.

out 키워드를 사용하면 참조를 통해 인수를 전달할 수 있습니다. 이러한 방식은 ref 키워드와 비슷합니다. 단, ref의 경우에는 변수를 전달하기 전에 초기화해야 합니다. out 매개 변수를 사용하려면 메서드 정의와 호출 메서드가 모두 명시적으로 out 키워드를 사용해야 합니다. 예를 들면 다음과 같습니다.

class OutExample
{
    static void Method(out int i)
    {
        i = 44;
    }
    static void Main()
    {
        int value;
        Method(out value);
        // value is now 44
    }
}

out 인수로 전달되는 변수는 전달하기 전에 초기화할 필요가 없지만 호출되는 메서드는 반환되기 전에 값을 할당해야 합니다.

ref 및 out 키워드는 서로 다른 런타임 동작을 수행하지만 컴파일 타임에 메서드 시그니처의 일부로 간주되지는 않습니다. 따라서 메서드 하나는 ref 인수를 사용하고 다른 하나는 out 인수를 사용한다는 것 외에는 차이점이 없으면 메서드를 오버로드할 수 없습니다. 예를 들어 다음 코드는 컴파일되지 않습니다.

class CS0663_Example
{
    // Compiler error CS0663: "Cannot define overloaded  
    // methods that differ only on ref and out". 
    public void SampleMethod(out int i) { }
    public void SampleMethod(ref int i) { }
}

그러나 다음과 같이 메서드 하나는 ref 또는 out 인수를 사용하고 다른 하나는 인수를 사용하지 않는 경우에는 오버로드를 수행할 수 있습니다.

class OutOverloadExample
{
    public void SampleMethod(int i) { }
    public void SampleMethod(out int i) { i = 5; }
}

속성은 변수가 아니므로 out 매개 변수로 전달할 수 없습니다.

배열 전달에 대한 자세한 내용은 ref 및 out을 사용하여 배열 전달(C# 프로그래밍 가이드)을 참조하세요.

다음과 같은 종류의 메서드에는 ref 및 out 키워드를 사용할 수 없습니다.

  • async 한정자를 사용하여 정의하는 비동기 메서드

  • yield return 또는 yield break 문을 포함하는 반복기 메서드

예제

메서드가 여러 값을 반환하도록 하려는 경우에는 out 메서드를 선언하면 유용합니다. 다음 예제에서는 out을 사용하여 단일 메서드 호출로 3개 변수를 반환합니다. 세 번째 인수는 null에 할당됩니다. 따라서 메서드가 값을 선택적으로 반환할 수 있습니다.

    class OutReturnExample
    {
        static void Method(out int i, out string s1, out string s2)
        {
            i = 44;
            s1 = "I've been returned";
            s2 = null;
        }
        static void Main()
        {
            int value;
            string str1, str2;
            Method(out value, out str1, out str2);
            // value is now 44 
            // str1 is now "I've been returned" 
            // str2 is (still) null;
        }
    }

참고 항목

기타 리소스

C# 참조