C# :: Lecture & TIPs

[C#] Inline Out Variables (인라인 Out 변수)

기존에는 Out Parameter (매개변수) 를 통해 Method (메소드) 를 호출하려면 우선적으로 변수를 인계하기 위해서 변수를 먼저 선언해주어야만 했습니다. 일반적으로 인계받는 Method (메소드) 가 변수를 초기화하는 역할을 해 주므로 이러한 변수들을 인계하기 전에는 초기화 해주지 않습니다. 이러한 이유로 var 을 사용해 변수를 선언하지 못하고, 변수의 Type (형식) 을 명시적으로 기입해주어야만 했습니다.

public void PrintCoordinates(Point p)
{
    int x, y; // 미리 선언해주어야 합니다.
    p.GetCoordinates(out x, out y);
    WriteLine($"({x}, {y})");
}

하지만 C# 7.0 에 Inline Out Variables (인라인 out 변수) 라는 문법이 추가되면서 전달 인자를 넘겨줄 때 변수를 선언 할 수 있게 되었습니다.

public void PrintCoordinates(Point p)
{
    p.GetCoordinates(out int x, out int y);
    WriteLine($"({x}, {y})");
}

그리고 위의 예시를 통해 Method 를 호출하는 경우에도 그 다음 행에서 전달 인자를 넘겨 줄 때 선언했던 변수를 그대로 사용할 수 있는 것을 확인 하실 수 있으실 텐데요, 이는 Inline Out Variables (인라인 Out 변수) 는 자신을 둘러싸고 있는 코드 블록 내에서 사용이 가능하다는 의미가 되겠습니다.

p.GetCoordinates(out int x, out int y);

또한, 굳이 형식을 명시적으로 지정해 줄 필요 없이, var 키워드를 활용하여 변수를 선언할 수도 있습니다. 함수의 매개변수 정의를 통해 매개변수의 형식을 유추하게 되는 것입니다.

public void PrintStars(string s)
{
    if (int.TryParse(s, out var i)) { WriteLine(new string('*', i)); }
    else { WriteLine("Cloudy - no stars tonight! :("); }
}

out 매개변수는 Try…(TryParse(), TryGetValue(), …) 패턴에서 주로 사용됩니다. 여기서 int.TryParse() 는 문자열 s 를 정수형으로 변환했는지에 대한 성공 여부를 Boolean 값으로 반환합니다. 변환에 성공했다면 변수 i 에는 변환된 값이 대입되게 됩니다.

p.GetCoordinates(out int x, out _); // 변수 x 의 값에만 관심 있을 때 사용합니다. 

만약, 어떠한 out 매개변수가 필요치 않은 경우 이를 무시할 수 있도록 “out _” 과 같이 작성할 수 있습니다. 가령, 간순히 어떠한 문자열이 정수로 변환이 될 수 있는지 여부를 확인하기 위한 목적으로 아래와 같이 코드를 작성해 볼 수 있습니다.

 string intString = "1992";

 if (int.TryParse(intString, out _))
 {
     // 정수인 경우 실행할 코드를 입력하세요.
 }
 else
 {
     // 정수가 아닌 경우 실행할 코드를 입력하세요.
 }

고맙습니다.

Advertisements

One comment

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s