JVM의 Integer Optimization

allocProc
Aug 11, 2021

--

Photo by Maksym Kaharlytskyi on Unsplash

다음 코드와 실행 결과를 살펴보자.

똑같이 == 연산자로 비교했는데 1000을 할당한 a == d 는 false를, 100을 할당한 b == c 는 true를 반환한다.

어째서 이런 결과가 나온걸까?

JVM의 Integer Optimization

JVM은 -128 ~ 127 사이의 Integer 객체를 캐싱해놓고 필요할 때 마다 꺼내쓴다.

그리고 자바의 == 연산자는 referential equality 이기 때문에 주소값을 비교한다.

Integer b와 c는 JVM이 캐싱한 Integer 객체의 주소를 가리키기 때문에 동일한 곳을 바라볼 수 밖에 없다. 그래서b == c 는 true 이다.
하지만 Integer a와 d는 각기 다른 주소의 Integer 객체를 가리키기 때문에 a == d 는 false 이다.

만약 a와 d의 값을 비교하고 싶다면 equals() 메소드를 사용해야한다.

Integers caching in Java

참고로 코틀린은 자바와 반대로

  • == 가 structual equality를, (equals() 메소드)
  • === 가 referential equality 를 의미한다.

Equality | Kotlin

--

--

No responses yet