13.2.3 조건 ?: 연산자와 참조 변수(C# 7.2)
조건 ?: 연산자는 C# 1.0부터 제공되는 기능이며 다른 언어에서도 흔히 제공되는 기능이기도 하다.
condition ? expression1 : expression2
이 연산자는 첫 번째 피연산자(condition)의 평가 결과에 따라 두 번째 혹은 세 번째 피연산자를 평가하여 전체 연산의 결과로 삼는데, 참조 값에 대해서도 condition에 따라 나머지 피연산자 중 하나가 선택되기를 바라는 것은 매우 당연한 기대다.
그런데 C# 7.0에서 참조 값에 대해서는 이 연산자를 제대로 사용할 수 없었다. C# 7.2가 되어서야 두 번째와 세 번째 피연산자에 대해서 참조 값을 사용할 수 있게 되었으며, 연산의 결과를 담는 변수에도 ref 한정자를 가진 변수를 사용할 수 있게 되었다. 예를 들어 다음 예제는 시퀀스에서 홀수와 짝수의 개수를 세는 메서드인데, 그 결과로 튜플을 반환한다.
예제 13-9 시퀀스에서 홀수와 짝수를 셈 ▶ RefConditional.cs
static (int even, int odd) CountEvenAndOdd(IEnumerable<int> values)
{
var result = (even: 0, odd: 0);
foreach (var value in values)
{
➊
ref int counter = ref (value & 1) == 0 ?
ref result.even : ref result.odd;
counter++; ----- 값을 1 증가시킴
}
return result;
}
➊ 증가시켜야 할 변수를 선택
특별한 이유가 있어서 튜플을 사용한 것은 아니지만, 변경이 가능한 변수로 튜플을 사용하는 유용한 예를 보여주고 있다. 그리고 이처럼 조건 ?: 연산자에 참조 값을 사용할 수 있도록 지원함으로써 언어가 좀 더 일관성 있게 보인다. 조건 ?: 연산자의 결과는 예제와 같이 참조 지역 변수에 할당할 수 있을 뿐 아니라, 참조 매개변수를 필요로 하는 인수로 사용하거나, 참조 반환 시에도 사용할 수 있다. 어떤 방식을 사용하더라도 그럴듯하다. C# 7.2에 추가된 기능 중 다음으로 알아볼 내용은 13.2.1절에서 참조 지역 변수의 제약 사항으로 이야기했던 읽기 전용 참조와 관련된 내용이다.