Oracle Certified Associate Java SE 8 Programmer 1 시험을 준비하면서 공식 학습 가이드에서 삼항 표현에 관한 다음 단락을 발견했습니다.
삼항 표현식 평가
Java 7부터는 삼항 연산자의 오른쪽 표현식 중 하나만 런타임에 평가됩니다. 단락 연산자와 유사한 방식으로 삼항 연산자의 두 오른쪽 표현식 중 하나가 부작용을 수행하면 런타임에 적용되지 않을 수 있습니다. 다음 예제로이 원리를 설명해 봅시다 : […]
다음 예제를 통해 두 식 중 하나만 평가된다고 말합니다.
int y = 1;
int z = 1;
int a = y < 10 ? y++ : z++;
여기에서는 예상대로 y
증가하지만 z
그렇지 않습니다.
내가 걸려 넘어지는 것은 “As of Java 7 …”이라는 단락의 시작 부분 (노란색으로 표시됨)입니다. Java 1.6으로 동일한 코드를 테스트했는데 동작의 차이를 찾을 수 없습니다. Java 1.6이 단락에 제공된 정보만으로 두 표현식을 모두 평가할 것으로 예상했습니다. “As of Java 7, …”로 무엇을 말하고 싶은지 아는 사람이 있습니까?
편집 : 혼동을 피하기 위해 : ‘As of Java 7’을 작성했기 때문에 Java 6에서 Java 7로 전환 할 때 삼항 연산자와 관련하여 변경된 것이 있습니까?
답변
저는이 책의 저자 중 한 명입니다. 내가 그 특정 문장을 작성하지는 않았지만, “이것은 Java 7에서 테스트되었습니다”라는 의도에 동의합니다. 우리가 다른 판을 작성하면 그것을 제거하도록 메모를 할 것입니다.
명확하게 말하면 삼항 연산자는 Java 8, 7, 6 등에서 동일한 방식으로 작동했습니다. 앞으로 변경 될 경우 상당히 놀랍습니다.
답변
로부터 자바 6 JLS :
런타임에 조건식의 첫 번째 피연산자식이 먼저 평가됩니다. 필요한 경우 결과에 대해 unboxing 변환이 수행됩니다. 그런 다음 결과 부울 값을 사용하여 두 번째 또는 세 번째 피연산자 식을 선택합니다.
- 첫 번째 피연산자의 값이 참이면 두 번째 피연산자식이 선택됩니다.
- 첫 번째 피연산자의 값이 거짓이면 세 번째 피연산자식이 선택됩니다.
그런 다음 선택한 피연산자식이 평가되고 결과 값은 위에서 설명한 규칙에 따라 결정된 조건식의 유형으로 변환됩니다. 이 변환에는 boxing (§5.1.7) 또는 unboxing 변환이 포함될 수 있습니다. 선택하지 않은 피연산자 식은 조건식의 특정 평가에 대해 평가되지 않습니다.
1.0으로 돌아가는 JLS 에디션에도 비슷한 문구가 나타납니다 . 동작은 Java 7에서 변경되지 않았습니다. 스터디 가이드의 내용이 잘못되었습니다.