Java에서는 Integer
클래스에서 이너 클래스로 IntegerCache
를 가지고 있다.
IntegerCache
의 주석을 살펴보면, -128 ~ 127 사이의 값을 캐싱한다고 적혀있다.
IntegerCache
를 살펴보기 전에,
Integer i1 = 1;
Integer i2 = Integer.valueOf(1);
위의 두 구문은 동일한 구문이다.
위의 1을 직접 할당해준 구문은 컴파일 시점에 자바 컴파일러가 자동으로 박싱하여(오토 박싱) Integer.valueOf(1)
로 변환하기 때문이다.
따라서 valueOf()
의 메소드를 살펴보면, cache 구간의 low 값과 high 값 사이면, IntegerCahce
의 캐싱된 값을 반환한다는 것을 알 수 있다.
결국 값을 직접 선언하든 valueOf()
로 boxing 하든 동일한 결과가 나온다.
반환되는 IntegerCache.cache
배열은 static이기 때문에 하나의 인스턴스만 존재하고, 따라서 다음과 같은 상황이 연출될 수 있다.
public class Test {
public static void main(String[] args) {
Integer i1 = 1;
Integer i2 = 1;
System.out.println(i1 == i2);
}
}
래퍼 클래스를 사용한 개발자의 의도와는 다르게 흘러갈 수 있기 때문에
-128 ~ 127은 Integer
의 기본 캐싱 구간이라는 것을 기억하자.
또한 위와 같이 IntegerCache
는 클래스 로딩 시점에 VM의 설정 값을 가져와서 캐싱 구간의 low와 high 값을 결정한다.
계속 살펴보다 보면, assert
라는 키워드가 등장한다.
assert
는 Java 1.4에서 추가된 구문으로, 해당 표현식이 false면 AssertError
을 발생시킨다.
assert 표현식:"String";
와 같이 작성하면 에러 발생 시 String도 함께 출력된다.
하지만 에러가 항상 발생하는 것이 아니라 컴파일 후
java -ea Test
와 같이 '-ea' 옵션을 붙여 실행시켜야만 발생할 수 있다.