(x = y) == x 와 x == (x = y) 가 다른 이유
- Stackoverflow/Java
- 2018. 12. 19.
이 글은, 스택오버플로우에 있는 글 중에 재미있는 내용이 있어서 포스팅을 해보려고 한다.
https://stackoverflow.com/questions/53749841/why-is-x-x-y-not-the-same-as-x-y-x
x == ( x = y ) 는 false가 출력이 되고, (x = y) == x가 출력이 된다는 내용이다.
일단 연산을 할 때, 괄호 안에 있는 부분이 먼저 연산이 되기 때문에 둘다 x는 y 값으로 치환을 하게 되고, 결국 둘 다 false가 나와야 할 것 같지만 실상은 그렇지 않다.
System.out.println((x = y) == x);
위와 같이 Comparing identical expressions 라는 동일한 조건 표현이라는 에러가 발생한다. 한마디로, false가 발생해야 될 부분에서 true가 발생한 것은 동일한 조건으로 인식을 했다는 의미이다.
실제 코드를 작성하면, 이클립스에서 true가 발생하는 규칙은 아래와 같이 Warning 메세지가 나왔다.
이해하기 쉬웠던 답변
이제 원래의 질문에 온다.
int x = 1;
int y = 3;
System.out.println(x == (x = y)); // false
먼저 x (1)이 스택으로 푸시됩니다. inner (x = y)가 평가되고 값 x (3)으로 스택에 푸시됩니다. 이제 x (1)은 x (3)과 비교되어 result가 false가됩니다.
x = 1; // reset
System.out.println((x = y) == x); // true
여기에서 (x = y)가 평가 될 것이고, 이제 x 값은 3이되고 x (3)은 스택으로 푸시됩니다. 이제 평등 후에 값이 변경된 x (3)이 스택으로 푸시됩니다. 이제 표현식이 평가되고 둘 다 동일하므로 결과가 true입니다.
즉, 위에 false가 나온 부분은 x = 1인 값을 ( )와의 결과와 대입을 한다는 것으로 별도의 객체가 2개 생성이 된다. 아래의 true 부분은 x가 이미 y 값으로 변해 버려서 x = 3이 되어 버린 후, 본인을 비교하니 에러가 발생하는 것이다.
여기서 한가지 함정이 있는데 바로, 괄호 안에 값을 먼저 계산한다는 우리들의 착각이다. 그러다보니 둘다 동일하게 x는 y값으로 대치가 되었을 거라 생각을 한다. 하지만 실제는 그렇지 않다 최종 연산만 괄호를 계산하고, 왼쪽에서 오른쪽 순서대로 값을 미리 구한다. 이와 같은 케이스는 많지 않겠지만, 연산하는 로직에 대해서 새로 알 수 있는 좋은 자료라고 생각한다.
'Stackoverflow > Java' 카테고리의 다른 글
Maven 에러, Mark goal compile as ignored in eclipse preferences (0) | 2019.06.23 |
---|---|
[Java] Cannot instantiate the type Map (0) | 2019.05.21 |
[JAVA] 엑셀 읽을 때, 형변환 에러가 발생할 경우 (2) | 2018.10.05 |
[JAVA] Excel 읽을 때, ClassNotFoundException: org.apache.xmlbeans.XmlObject (0) | 2018.09.18 |
mysql connector의 버전에 따른, 톰캣 오류 (0) | 2018.05.08 |