out 매개 변수 한정자(C# 참조)out parameter modifier (C# Reference)

out 키워드를 사용하면 참조를 통해 인수를 전달할 수 있습니다.The out keyword causes arguments to be passed by reference. 이 키워드는 정식 매개 변수를 위해 해당 인수의 별칭을 만드는데, 이는 반드시 변수여야 합니다.It makes the formal parameter an alias for the argument, which must be a variable. 즉, 매개 변수에 대한 모든 작업이 인수에서 수행됩니다.In other words, any operation on the parameter is made on the argument. 이러한 방식은 ref 키워드와 비슷합니다. 단, ref의 경우에는 변수를 전달하기 전에 초기화해야 합니다.It is like the ref keyword, except that ref requires that the variable be initialized before it is passed. in이 호출된 메서드에서 인수 값 수정을 허용하지 않는 것을 제외하고 in 키워드와도 같습니다.It is also like the in keyword, except that in does not allow the called method to modify the argument value. out 매개 변수를 사용하려면 메서드 정의와 호출 메서드가 모두 명시적으로 out 키워드를 사용해야 합니다.To use an out parameter, both the method definition and the calling method must explicitly use the out keyword. 예:For example:

int initializeInMethod;
OutArgExample(out initializeInMethod);
Console.WriteLine(initializeInMethod);     // value is now 44

void OutArgExample(out int number)
{
    number = 44;
}

참고

out 키워드를 제네릭 형식 매개 변수와 함께 사용하여 형식 매개 변수를 공변(covariant)으로 지정할 수도 있습니다.The out keyword can also be used with a generic type parameter to specify that the type parameter is covariant. 이 컨텍스트에서 out 키워드를 사용하는 방법에 대한 자세한 내용은 out(제네릭 한정자)을 참조하세요.For more information on the use of the out keyword in this context, see out (Generic Modifier).

out 인수로 전달되는 변수는 메서드 호출에서 전달되기 전에 초기화할 필요가 없지만Variables passed as out arguments do not have to be initialized before being passed in a method call. 호출된 메서드는 메서드가 반환되기 전에 값을 할당해야 합니다.However, the called method is required to assign a value before the method returns.

in, refout 키워드는 오버로드 해결을 위한 메서드 시그니처의 일부로 간주되지 않습니다.The in, ref, and out keywords are not considered part of the method signature for the purpose of overload resolution. 따라서 메서드 하나는 ref 또는 in 인수를 사용하고 다른 하나는 out 인수를 사용한다는 것 외에는 차이점이 없으면 메서드를 오버로드할 수 없습니다.Therefore, methods cannot be overloaded if the only difference is that one method takes a ref or in argument and the other takes an out argument. 예를 들어 다음 코드는 컴파일되지 않습니다.The following code, for example, will not compile:

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, in 또는 out 인수를 사용하고 다른 하나는 해당 한정자를 갖지 않는 경우에는 오버로드를 수행할 수 있습니다.Overloading is legal, however, if one method takes a ref, in, or out argument and the other has none of those modifiers, like this:

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

컴파일러는 메서드 호출에 사용되는 매개 변수 한정자에 호출 사이트에서 매개 변수 한정자를 일치하여 적합한 오버로드를 선택합니다.The compiler chooses the best overload by matching the parameter modifiers at the call site to the parameter modifiers used in the method call.

속성은 변수가 아니므로 out 매개 변수로 전달할 수 없습니다.Properties are not variables and therefore cannot be passed as out parameters.

다음과 같은 종류의 메서드에는 in, refout 키워드를 사용할 수 없습니다.You can't use the in, ref, and out keywords for the following kinds of methods:

  • async 한정자를 사용하여 정의하는 비동기 메서드Async methods, which you define by using the async modifier.

  • yield return 또는 yield break 문을 포함하는 반복기 메서드Iterator methods, which include a yield return or yield break statement.

out 매개 변수 선언Declaring out parameters

out 인수를 사용하여 메서드를 선언하는 것은 여러 값을 반환하기 위한 일반적인 해결 방법입니다.Declaring a method with out arguments is a classic workaround to return multiple values. C# 7.0부터 비슷한 시나리오에 대해 튜플을 고려하세요.Beginning with C# 7.0, consider tuples for similar scenarios. 다음 예제에서는 out을 사용하여 단일 메서드 호출로 3개 변수를 반환합니다.The following example uses out to return three variables with a single method call. 세 번째 인수는 null에 할당됩니다.Note that the third argument is assigned to null. 따라서 메서드가 값을 선택적으로 반환할 수 있습니다.This enables methods to return values optionally.

void Method(out int answer, out string message, out string stillNull)
{
    answer = 44;
    message = "I've been returned";
    stillNull = null;
}

int argNumber;
string argMessage, argDefault;
Method(out argNumber, out argMessage, out argDefault);
Console.WriteLine(argNumber);
Console.WriteLine(argMessage);
Console.WriteLine(argDefault == null);

// The example displays the following output:
//      44
//      I've been returned
//      True

out 인수를 사용하여 메서드 호출Calling a method with an out argument

C# 6 및 이전 버전에서는 out 인수로 전달하기 전에 별도 문에서 변수를 선언해야 합니다.In C# 6 and earlier, you must declare a variable in a separate statement before you pass it as an out argument. 다음 예제에서는 Int32.TryParse 메서드에 전달되기 전에 number라는 변수를 선언합니다. 이 메서드는 문자열을 숫자로 변환하려고 합니다.The following example declares a variable named number before it is passed to the Int32.TryParse method, which attempts to convert a string to a number.

string numberAsString = "1640";

int number;
if (Int32.TryParse(numberAsString, out number))
    Console.WriteLine($"Converted '{numberAsString}' to {number}");
else
    Console.WriteLine($"Unable to convert '{numberAsString}'");
// The example displays the following output:
//       Converted '1640' to 1640

C# 7.0부터 별도 변수 선언이 아니라 메서드 호출의 인수 목록에서 out 변수를 선언할 수 있습니다.Starting with C# 7.0, you can declare the out variable in the argument list of the method call, rather than in a separate variable declaration. 이렇게 하면 보다 간결하고 읽기 쉬운 코드가 생성되며 메서드 호출 전에 실수로 변수에 값이 할당되는 경우를 방지할 수 있습니다.This produces more compact, readable code, and also prevents you from inadvertently assigning a value to the variable before the method call. 다음 예제는 Int32.TryParse 메서드 호출에서 number 변수를 정의한다는 점을 제외하고 이전 예제와 비슷합니다.The following example is like the previous example, except that it defines the number variable in the call to the Int32.TryParse method.

string numberAsString = "1640";

if (Int32.TryParse(numberAsString, out int number))
    Console.WriteLine($"Converted '{numberAsString}' to {number}");
else
    Console.WriteLine($"Unable to convert '{numberAsString}'");
// The example displays the following output:
//       Converted '1640' to 1640

앞의 예제에서 number 변수는 int로 강력하게 형식화됩니다.In the previous example, the number variable is strongly typed as an int. 다음 예제와 같이 암시적 형식 지역 변수를 선언할 수도 있습니다.You can also declare an implicitly typed local variable, as the following example does.

string numberAsString = "1640";

if (Int32.TryParse(numberAsString, out var number))
    Console.WriteLine($"Converted '{numberAsString}' to {number}");
else
    Console.WriteLine($"Unable to convert '{numberAsString}'");
// The example displays the following output:
//       Converted '1640' to 1640

C# 언어 사양C# Language Specification

자세한 내용은 C# 언어 사양을 참조하세요.For more information, see the C# Language Specification. C# 언어 사양은 C# 구문 및 사용법에 대한 신뢰할 수 있는 소스입니다.The language specification is the definitive source for C# syntax and usage.

참고 항목See also