Java

[이펙티브 자바] Item 61. 박싱된 기본 타입보다는 기본 타입을 사용하라

nan2 2023. 1. 30. 13:45
반응형

기본 타입이란 int, double, boolean ...

박싱된 기본 타입이란 기본 타입과 1대1 대칭되는 Integer, Double, Boolean ...

 

기본 타입과 박싱된 기본 타입의 차이점

 

1. 기본 타입은 값만 가지고 있고, 박싱된 기본 타입(참조 타입)은 값 + 식별성을 가진다.

박싱된 기본 타입은 두 인스턴스의 값이 같아도 서로 다른 객체임.

 

예제

int i = 1, j = 1;
Integer k = new Integer(2);
Integer l = new Integer(2);

if (i == j)
	System.out.println("i와 j는 같다!");

if (k == l)
	System.out.println("k와 l은 같다!");

 

→  'i와 j는 같다!' 라고 출력되지만 'k와 l은 같다!' 는 출력되지 않는다.

 

* == 연산자와 equals()

== 연산자는 대상의 주소값을 비교하는 연산자이다. (객체와 객체를 비교)

equals() 는 대상의 값 자체를 비교하는 메서드이다.

 

기본 타입(call by value)의 경우 대상의 주소값을 가지지 않고 값만 가지기 때문에 == 연산자로 비교할 수 있고,

참조 타입(call by reference)의 경우 대상의 주소값을 참조하여 대상의 값을 비교하기 때문에 equals() 를 사용해서 비교할 수 있다.

 

2. 기본 타입은 유효한 값을 가지고, 박싱된 기본 타입은 Null 을 가질 수 있다.

 

예제

Integer num = new Integer();

if (num == 42) 
	System.out.println("num은 42다!");

여기서 num은 Integer 타입으로 객체 생성되었지만, 값을 초기화하지 않았기 때문에 저 코드를 실행하면

NullPointerException이 발생한다.

 

(기본 타입의 경우 초기화시켜 주지 않으면 0이 초기값임)

 

 

3. 기본 타입을 사용하는 것이 더 메모리, 속도 면에서 효율적이다.

 

예제

    Long sum = 0L;
    for (long i = 0L; i < Integer.MAX_VALUE; i++) {
        sum += i;
    }
    System.out.println(sum);

여기서 sum은 Long -> long 타입으로 언박싱되고, + i 를 해준다음 sum이 Long 타입으로 박싱되기 때문에 성능이 저하된 코드이다.

 

 

언제 박싱된 기본 타입을 사용할까?

 

1. 컬렉션을 사용할 경우 

컬렉션: 요소들의 리스트나 집합을 관리하는 자료구조 ( HashMap<Long, Object>, ArrayList<String> ...)

 

2. 제네릭 타입을 사용하는 경우

제네릭: 일반화 시킨 매개변수 타입으로 클래스, 인터페이스, 메서드를 일반화 시킴 (List<T>, MyClass<E>, ...)

 

반응형