C#에서 메서드는 기본적으로 하나의 반환값만 가질 수 있지만, 몇 가지 기법을 활용하면 여러 값을 동시에 반환하는 것과 같은 효과를 얻을 수 있습니다. 대표적인 방법은 다음과 같습니다.
- 참조 매개변수(ref)
- 출력 매개변수(out)
- 배열 반환
- 튜플(Tuple) 반환
참조 매개변수(ref) 사용
ref 키워드를 사용하면 변수의 참조를 메서드에 전달할 수 있습니다. 메서드 내부에서 이 변수의 값을 변경하면 호출자 쪽 원본 변수에도 그대로 반영되기 때문에, 사실상 여러 값을 돌려받는 효과를 얻을 수 있습니다.
예제
class Program{
static int ReturnMultipleValuesUsingRef(int firstNumber, ref int secondNumber){
secondNumber = 20;
return firstNumber;
}
static void Main(){
int a = 10;
int refValue = 0;
var res = ReturnMultipleValuesUsingRef(a, ref refValue);
System.Console.WriteLine($" Ref Value {refValue}");
System.Console.WriteLine($" Function Return Value {res}");
Console.ReadLine();
}
}
실행 결과
Ref Value 20 Function Return Value 10
출력 매개변수(out) 사용
out 키워드는 ref와 유사하게 작동하지만, 메서드 내부에서 반드시 값을 할당해야 한다는 차이점이 있습니다. 호출자는 초기화되지 않은 변수를 전달할 수 있어서, 여러 개의 결과값을 돌려받는 용도로 자주 사용됩니다.
예제
class Program{
static int ReturnMultipleValuesUsingOut(int firstNumber, out int secondNumber){
secondNumber = 20;
return firstNumber;
}
static void Main(){
int a = 10;
int outValue = 0;
var res = ReturnMultipleValuesUsingOut(a, out outValue);
System.Console.WriteLine($" Out Value {outValue}");
System.Console.WriteLine($" function Return Value {res}");
Console.ReadLine();
}
}
실행 결과
Out Value 20 Function Return Value 10
배열 반환
같은 타입의 여러 값을 반환해야 한다면 배열을 활용하는 것이 간단한 해결책입니다. 반환 타입을 배열(int[] 등)로 선언하고, 필요한 값들을 요소로 담아 반환하면 됩니다.
예제
class Program{
static int[] ReturnArrays(){
int[] arrays = new int[2] { 1, 2 };
return arrays;
}
static void Main(){
var res = ReturnArrays();
System.Console.WriteLine($"{res[0]} {res[1]}");
Console.ReadLine();
}
}
실행 결과
1 2
튜플(Tuple) 반환
타입이 서로 다른 여러 값을 반환해야 한다면 튜플이 유용합니다. Tuple<T1, T2> 형태로 반환 타입을 지정하면 두 개 이상의 값을 하나의 객체로 묶어 전달할 수 있으며, Item1, Item2 속성을 통해 각 값에 접근할 수 있습니다. 참고로 C# 7.0부터는 더 간결한 문법의 값 튜플(ValueTuple)도 사용할 수 있습니다.
예제
class Program{
static Tuple<int, int>ReturnMulitipleVauesUsingTuples(){
return new Tuple<int, int>(10, 20);
}
static void Main(){
var res = ReturnMulitipleVauesUsingTuples();
System.Console.WriteLine($"{res.Item1} {res.Item2}");
Console.ReadLine();
}
}
실행 결과
10 20