[java] Java ?: 연산자 란 무엇이며 어떤 역할을합니까?

나는 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);
}


답변

정확하게 정확하지 않은 :

  1. isHere가 true 인 경우 getHereCount () 의 결과리턴됩니다.
  2. 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를 사용하여 초기화 할 수 있습니다. 그러나 나는이 청소기를 찾습니다.


답변

condition ? truth : false;

조건이 true첫 번째 표현식이면 평가하십시오. 조건이 false인 경우 두 번째 표현식을 평가하십시오.

조건부 연산자 라고 하며 유형은 삼항 연산 입니다.