나는 2 년 동안 Java로 일해 왔지만 최근까지는이 구성을 뛰어 넘지 못했습니다.
int count = isHere ? getHereCount(index) : getAwayCount(index);
이것은 아마도 매우 간단한 질문이지만 누군가 설명 할 수 있습니까? 어떻게 읽습니까? 어떻게 작동하는지 잘 알고 있습니다.
- 경우
isHere
사실이다,getHereCount()
라고, - 경우
isHere
거짓getAwayCount()
이라고합니다.
옳은? 이 구조는 무엇입니까?
답변
그렇습니다.
int count;
if (isHere)
count = getHereCount(index);
else
count = getAwayCount(index);
이를 조건부 연산자 라고합니다 . Java, C, C ++ 및 기타 여러 언어에서 유일하게 삼항 (3 인수) 연산자이기 때문에 많은 사람들이 이것을 잘못 삼항 연산자 라고 부릅니다 . 그러나 이론적으로있을 수있는 단 하나의있을 수있는 반면, 또 다른 삼항 연산자가 될 조건 연산자 .
공식 명칭은 Java 언어 사양에 나와 있습니다 .
§15.25 조건부 연산자? :
조건부 연산자
? :
는 한 표현식의 부울 값을 사용하여 두 개의 다른 표현식 중 어떤 것을 평가할지 결정합니다.
두 가지 모두 반환 값이있는 메소드로 연결되어야합니다.
두 번째 또는 세 번째 피연산자 표현식이 void 메소드를 호출하는 것은 컴파일 타임 오류입니다.
실제로, 표현 문의 문법 ( §14.8 )에 의해, void 메소드의 호출이 나타날 수있는 어떤 상황에서도 조건식이 나타나는 것은 허용되지 않습니다.
따라서 void 메소드 인 경우 doSomething()
이를 doSomethingElse()
압축 할 수 없습니다.
if (someBool)
doSomething();
else
doSomethingElse();
이것으로 :
someBool ? doSomething() : doSomethingElse();
간단한 단어 :
booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse
답변
다른 사람들은 이것을 합리적인 정도로 대답했지만 종종 “삼항 연산자”라는 이름으로 대답했습니다.
나는 pedant이기 때문에 연산자의 이름이 조건부 연산자 또는 “조건부 연산자? :”임을 분명히하고 싶습니다. 그것은이다 삼항 연산자 (이 세 개의 피연산자를 가지고있는 것을) 순간에 자바에있는 유일한 삼항 연산자로 발생합니다.
그러나 스펙은 그 이름이 조건부 연산자 또는 “조건부 연산자? :”라는 것이 분명합니다. 피연산자가 몇 개가 아닌 연산자의 동작을 어느 정도 (조건 평가) 나타내는 것으로 표시되므로 그 이름으로 호출하는 것이 더 명확하다고 생각합니다.
답변
Sun Java Specification 에 따르면이를 조건부 연산자라고합니다. 섹션 15.25를 참조하십시오. 당신은 그것이 무엇을하는 것이 옳습니다.
조건부 연산자? : 한 표현식의 부울 값을 사용하여 두 개의 다른 표현식 중 어느 것을 평가할지 결정합니다.
조건부 연산자는 구문 상 오른쪽 연관 (오른쪽에서 왼쪽으로 그룹화)이므로 a? b : c? d : e? f : g는 a? b : (c? d : (e? f :지)).
ConditionalExpression:
ConditionalOrExpression
ConditionalOrExpression ? Expression : ConditionalExpression
조건부 연산자에는 세 가지 피연산자 표현식이 있습니다. ? 첫 번째 식과 두 번째 식 사이에가 나타나고 :가 두 번째 식과 세 번째 식 사이에 나타납니다.
첫 번째 표현식은 부울 또는 부울 유형이어야합니다. 그렇지 않으면 컴파일 타임 오류가 발생합니다.
답변
int count = isHere ? getHereCount(index) : getAwayCount(index);
의미 :
if (isHere) {
count = getHereCount(index);
} else {
count = getAwayCount(index);
}
답변
정확하게 정확하지 않은 :
- isHere가 true 인 경우 getHereCount () 의 결과 가 리턴됩니다.
- otheriwse getAwayCount () 의 결과 가 반환됩니다
“반환”은 매우 중요합니다. 즉, 메소드 가 값을 리턴 해야 하며 해당 값을 어딘가에 지정 해야합니다 .
또한 구문 적으로 if-else 버전과 동일 하지 않습니다 . 예를 들면 다음과 같습니다.
String str1,str2,str3,str4;
boolean check;
//...
return str1 + (check ? str2 : str3) + str4;
if-else로 코딩하면 항상 더 많은 바이트 코드가 생성됩니다.
답변
3 차 조건부; 토마토, tomatoh. 정말 유용한 것은 변수 초기화입니다. (나처럼) 변수가 정의 된 곳에서 변수를 초기화하는 것을 좋아한다면 조건부 삼항 연산자 (둘 다)는 값에 대한 조건이있는 경우에 그렇게 할 수 있습니다. 특히 최종 분야에서 주목할 만하지 만 다른 곳에서도 유용합니다.
예 :
public class Foo {
final double value;
public Foo(boolean positive, double value) {
this.value = positive ? value : -value;
}
}
어떤 이름 으로든 그 연산자가 없으면 필드를 최종 값으로 만들거나 단순히 초기화하는 함수를 작성해야합니다. 실제로, 그것은 옳지 않습니다-적어도 Java에서는 if / else를 사용하여 초기화 할 수 있습니다. 그러나 나는이 청소기를 찾습니다.