Section 3.6: ? : 삼항 연산자

주어진 Boolean 표현식의 값에 따라서 두가지 값 중 하나를 반환한다.

문법:

condition ? expression_if_true : expression_if_false;

예제:

string name = "Frank"; Console.WriteLine(name == "Frank" ? "The name is Frank" : "The name is not Frank");

3항 연산자는 우측 우선 결합 (right-associative) 방식의 복합 연산식 (compound expression) 을 지원한다. 이 기능은 상위 3항 연산의 true 혹은 false 위치에 또다른 3항 연산을 추가함으로써 이용할 수 있다. 가독성을 훼손하지 않기 위해서는 많은 노력이 필요하겠지만, 경우에 따라 이러한 기능은 유용한 단축 표현을 제공해 줄 수 있다.

역주: 3항 연산자의 우측 우선 결합에 따른 장점은 이곳에 잘 소개되어 있습니다.

이 예제에서는, 복합 3항 연산이 범위 제한 함수 (clamp function) 에 구현되어 값이 범위 안에 있으면 본래 값을, 최소값보다 작으면 최소값을, 최대값보다 크면 최대값을 반환해 주게 된다.

light.intensity = Clamp(light.intensity, minLight, maxLight); public static float Clamp(float val, float min, float max) { return (val < min) ? min : (val > max) ? max : val; }

3항 연산자는 아래와 같이 중첩되어 (nested) 사용될 수도 있다:

a ? b ? "a is true, b is true" : "a is true, b is false" : "a is false" // 이는 왼쪽에서 오른쪽 방향으로 평가되며 괄호를 포함했을때 좀 더 알아보기 수월하다: a ? (b ? x : y) : z // 이 식의 결과는 a && b 인 경우 x, a && !b 인 경우 y, !a 인 경우 z 가 된다

복합 3항 연산 구문을 작성하는 경우, 괄호나 들여쓰기를 활용하여 가독성을 높이는 것이 일반적이다.

expression_if_trueexpression_if_false 의 타입은 동일해야 하며, 그렇지 않은 경우에는 한 타입으로부터 다른 타입으로의 묵시적 변환이 존재하여야 한다.

condition ? 3 : "Not three"; // int 와 string 간의 묵시적 변환이 존재하지 않으므로 컴파일이 되지 않는다. condition ? 3.ToString() : "Not three"; // 가능한 두가지 결과가 모두 string 타입이므로 OK. condition ? 3 : 3.5; // int 로부터 double 로의 묵시적 변환이 존재하므로 OK. 삼항 연산자의 결과값은 double 이 될 것이다. condition ? 3.5 : 3; // int 로부터 double 로의 묵시적 변환이 존재하므로 OK. 삼항 연산자의 결과값은 double 이 될 것이다.

타입 및 변환 관련한 요구사항은 사용자 정의 클래스에 대해서도 동일하게 적용된다.

public class Car {} public class SportsCar : Car {} public class SUV : Car {} condition ? new SportsCar() : new Car(); // SportsCar 로부터 Car 로의 묵시적 변환이 존재하므로 OK. 삼항 연산자의 결과값은 Car 타입의 reference 가 될 것이다. condition ? new Car() : new SportsCar(); // SportsCar 로부터 Car 로의 묵시적 변환이 존재하므로 OK. 삼항 연산자의 결과값은 Car 타입의 reference 가 될 것이다. condition ? new SportsCar() : new SUV(); // SportsCar 로부터 SUV 로의, 혹은 SUV 로부터 SportsCar 로의 묵시적 변환이 존재하지 않으므로 컴파일이 되지 않는다. 컴파일러는 두 타입 모두가 Car 로의 묵시적 변환이 존재함을 알아차릴 정도로 똑똑하지는 않다. condition ? new SportsCar() as Car : new SUV() as Car; // 두 표현식이 모두 Car 타입의 reference 로 평가 (evaluate) 되므로 OK. 삼항 연산자의 결과값은 Car 타입의 reference 가 될 것이다.
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

+ Recent posts