Post

Java 형 변환 연산자 우선순위

문제

다음은 Java 코드입니다.

1
2
3
long dividend = 10_000_000_000L;
long divisor = 10L;
int quotient = (int) dividend / divisor;

위에서 quotient의 값은 무엇일까요? 1_000_000_000 일까요?

jshell 에서 연산해본 결과값은 141_006_540 입니다.

연산 순서

1
(int) dividend / divisor;

위 코드에서는 먼저 dividend 를 int 로 형 변환하게 됩니다. 그럼 10_000_000_000 는 int의 최대값인 2_147_483_647 를 초과하게 되므로, 오버플로우가 발생합니다.

jshell 에서 출력된 결과값은 1_410_065_408 이고, 이를 10L 로 나누면 앞서 본, 141_006_540 이 됩니다.

올바른 연산

올바른 연산 결과를 얻기 위해서는 아래와 같이 괄호를 사용하여 나눗셈이 먼저 수행되도록 해야 합니다.

1
int quotient = (int) (dividend / divisor);

아래는 jshell 에서 연산을 수행한 결과입니다.

jshell에서 연산을 수행한 결과 화면

연산 우선순위

모두 알고 계시듯 괄호로 둘러 싼 표현식이 가장 먼저 평가가되고, 그 다음은 단항 연산자가 평가됩니다. 그리고 그 다음은 사칙 연산자가 아닌 형 변환(type casting) 연산자가 우선 평가됩니다.

대학 교재에 나와 있는 연산자 우선순위

출처 : https://introcs.cs.princeton.edu/java/11precedence/

뭔가 불안하다 싶으면 괄호로 가독성을 해치지 않는 선에서 묶어주는게 좋겠습니다.

잡설

프로그래머스에서 코딩테스트 문제(링크)를 풀다가 로직이 아무리 생각해도 이상 없는 것 같은데, 계속 틀려서 시간을 많이 소모했습니다.

여태 형 변환을 별로 할 일이 없어서 그런지 형 변환 연산자의 우선순위에 대해서 생각해본적이 없던 것 같습니다. 대체로 아래와 같이 Oracle 웹 사이트에 나와있는 정도의 수준이 보통의 Java 서적에서 볼 수 있는 것이다보니, 추가로 생각해볼 생각을 하지 못한 것으로 보입니다. 저의 부족함이겠죠.

Oracle 웹 사이트에 나와있는 연산자 우선순위

출처: oracle.com

코딩테스트 문제를 꾸준히 풀어보는게 지식의 구멍을 채우기에 좋은 것 같습니다.

This post is licensed under CC BY 4.0 by the author.