Java IntegerCache

wannabeking·2022년 10월 21일
0

Java

목록 보기
6/13
post-thumbnail

IntegerCache

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라는 키워드가 등장한다.

assert는 Java 1.4에서 추가된 구문으로, 해당 표현식이 false면 AssertError을 발생시킨다.

assert 표현식:"String";
와 같이 작성하면 에러 발생 시 String도 함께 출력된다.

하지만 에러가 항상 발생하는 것이 아니라 컴파일 후

java -ea Test와 같이 '-ea' 옵션을 붙여 실행시켜야만 발생할 수 있다.



profile
내일은 개발왕 😎

0개의 댓글