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_true
와 expression_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/
반응형
'번역 > C# Notes for Professionals' 카테고리의 다른 글
3.8: 배타적 논리합 ("exclusive or") 연산자 (0) | 2020.11.04 |
---|---|
3.7: ?. (Null 조건부 연산자) (0) | 2020.11.03 |
3.5: 단락 평가 (Short-circuiting) 연산자 (0) | 2020.10.28 |
3.4: 묵시적 캐스팅 연산자와 명시적 캐스팅 연산자 (0) | 2020.10.27 |
3.3: 관계 연산자 (Relational Operator) 들 (0) | 2020.10.26 |