본문 바로가기

JAVA

포장 클래스와 등호(==)

public static void main(String[] args) {
    int i1 = 1000;
    int i2 = 1000;
    Integer i3 = 1000;
    Integer i4 = 1000;

    System.out.println(i1==i2);  // true
    System.out.println(i3==i4);  // false
}

 

포장 클래스는 원시 자료형을 하나의 객체로 사용하고자 할 때 쓰인다.

 

원시 자료형은 등호(==)를 사용해 비교할 때, 값 그 자체를 비교하지만,

 

포장 클래스 변수는 참조형이고, 참조형 변수에 등호를 사용할시 동일한 객체를 가리키는지를 비교하기 때문에,

 

두 포장 클래스 인스턴스 안의 값이 같더라도 별개의 객체이기 때문에 거짓을 반환한다.

 

그래서 일반적으로 포장 클래스 안의 값을 비교할 때는 equals 메서드를 사용한다.

 

하지만 등호로 비교시 다른 결과를 반환하는 예외가 있다.

 

public static void main(String[] args) {

    Integer i5 = 123;
    Integer i6 = 123;
    System.out.println(i5==i6);  // true
}

위 코드에서 i5와 i6은 포장 클래스 인스턴스인데도 등호로 비교시 '참'을 반환한다.

 

그 이유는 -128부터 127까지의 포장 클래스 인스턴스가 미리 메모리에 만들어져 있고,

 

해당 범위 안의 있는 값으로 포장 클래스를 생성 시,

 

실제로 생성하지 않고 캐시에 미리 만들어져 있는 인스턴스를 가리키게 하기 때문이다.


그렇다면 왜 자바는 위의 범위의 값에 대해서만 이런 동작을 하는 것일까?

 

바로 메모리 절약을 위해서이다.

 

자바 문서에 따르면, 자바에서의 정수는 -128부터 127까지가 가장 많이 사용된다고 한다.

 

그러므로 위 범위에 해당하는 값을 가진 포장 클래스 인스턴스를 일일히 생성하는 것보다는

 

미리 생성한 인스턴스를 가리키게 하는 것이 메모리, 시간, 성능 차원에서 더 이득인 셈이다.

 

방송 시청을 예로 들면,

 

집 안의 모든 사람이 동일한 채널을 시청하고자 하는 경우

 

각자 텔레비전, 컴퓨터, 스마트폰 등으로 따로 시청하는 것보다는

 

모두 거실에 모여서 텔레비전 한 대로 보는 것이 전기 절약에 있어 효율적이지 않은가?

 

자바는 이를 고려하여 더 효율적인 면을 선택한 것이다.

 

(Short, Byte, Character 또한 위와 같이 동작한다.)

 

(Boolean은 두 개의 값밖에 없으므로, 두 개의 인스턴스를 캐싱하고 사용하는 것이 당연히 효율적이다.)