본문 바로가기

.NET/C#

[C#] out 형식 파라미터 사용법

메서드에서 두 개 이상의 값을 반환해야 하는 경우는 매우 빈번하다. 하지만 반환형이 void가 아닌 메서드에 대해서 반환 값은 반드시 1개만 존재할 수 있다. 이러한 경우 out 형식 파라미터를 사용하여 여러 개의 값을 메서드의 결과물로써 받아올 수 있다.

 

out 키워드의 사용법은 다음과 같다.

// x를 y로 나눈 결과를 반환하는 메서드
bool TryDivide(double x, double y, out double result)
{
	result = double.NaN;	// out 형식 파라미터는 반드시 최소 1회 값을 지정해줘야 한다.
    
    if(y == 0) return false;
    
    result = x / y;
    return true;
}

주석으로 명시해놨듯이 out 형식의 매개변수는 메서드가 종료되기 전에 반드시 어떠한 값으로라든 초기화가 되어야 한다.

 

위 메서드는 단순히 x를 y로 나눈 결과를 구하기 위한 메서드인데, 수학에서 0으로 나누는 행위는 금지되어 있으므로 y가 0인지 검사하여 0인 경우 false를 반환하고, 0이 아닌 경우 true를 반환하여 메서드를 호출한 위치에서 나누기가 정상적으로 수행되었는지를 확인할 수 있도록 하는 구조를 가진다.

따라서 TryDivide()의 사용은 아래와 같다.

static void Main(string[] args)
{
	double x, y, result;
    Console.Write("x 입력 : ");
    x = double.Parse(Console.ReadLine());
    Console.Write("y 입력 : ");
    y = double.Parse(Console.ReadLine());
    
    if(TryDivide(x, y, out result))
    {
    	Console.WriteLine($"{x} / {y} = {result}");
    }
    else
    {
    	Console.WriteLine("0으로 나누려고 시도했습니다.");
    }
}

 

값을 지정받기 위해 out 형식 매개변수가 들어갈 자리에 out 키워드와 함께 값을 지정받을 변수를 적는다.

또는 아래와 같이 변수를 새로 생성하면서 지정할 수도 있다.

if(TryDivide(x, y, out double result))	// ok!
{
	Console.WriteLine($"{result}");
}

 

보통 Parse 메서드를 사용하여 문자열로 표현된 어떤 값을 다른 형식으로 변환하는데, 만약 변환에 실패한 경우 예외가 발생한다. 이러한 상황을 위해 Parse와 더불어 TryParse 메서드 역시 제공되며 아래와 같이 사용 가능하므로 적극 활용하자.

static void Main(string[] args)
{
    Console.Write("x 입력 : ");
    if(!double.TryParse(Console.ReadLine(), out double x))
    {
    	Console.WriteLine("올바른 실수 형태가 아닙니다.");
        return;
    }
  
    Console.Write("y 입력 : ");
    if(!double.TryParse(Console.ReadLine(), out double y))
    {
    	Console.WriteLine("올바른 실수 형태가 아닙니다.");
        return;
    }
    
    if(TryDivide(x, y, out double result))
    {
    	Console.WriteLine($"{x} / {y} = {result}");
    }
    else
    {
    	Console.WriteLine("0으로 나누려고 시도했습니다.");
    }
}

TryParse() 메서드는 문자열 표현을 지정된 타입으로 변환을 시도하며, 변환에 성공한 경우 true를 반환하고, 실패한 경우 false를 반환한다. TryParse()가 true를 반환한 경우 out 형식으로 지정된 매개변수에 결과가 들어있으며, 그렇지 않은 경우 초기화되지 않은 상태로 반환되며, 만약 기존에 값을 가지고 있더라도 해당 값은 사라진다.

double.TryParse()의 경우는 특별하게도 변환을 시도했으나 변환된 값이 double.MinValue보다 작은 경우 음의 무한대, double.MaxValue보다 큰 경우 양의 무한대가 된다고 docs에 명시되어 있다. 일반적으로는 그냥 결과가 false인 경우 result를 사용하지 않으면 된다.

 

대부분의 숫자 형식에는 Parse() 및 TryParse() 메서드가 존재하니 참고하면 좋다. 뿐만 아니라 값의 문자열 표현이 일련의 규칙을 갖는 자료형 일부에도 Parse() 메서드가 존재할 수 있다. 대표적으로 DateTime 형식, IPAddress 형식 등이 Pasre()를 지원한다.