아이템 49. 객체화 된 기본 자료형 대신 기본 자료형을 이용하라
49. 객체화 된 기본 자료형 대신 기본 자료형을 이용하라
자바의 자료형
- 기본 자료형(primitive type) : int, double, boolean 등
- 참조 자료형(reference type) : String, List등 클래스로 정의된 일반 적인 객체들
- 객체화된 기본 자료형 (boxed primitive type) : Integer, Double, Boolean 등, 자바에서 자동으로 참조 객체(자동 객체화(autobxing))로 대응 시켜줌
Boxing
자바 1.5 부터 자동 객체화(autoboxing)와 자동 비 객체화(auto-unboxing)가 언어의 일부가 됨.
- autoboxing : int -> Integer
- auto-unboxing : Integer -> int
기본 자료형과 객체화된 기본자료형에는 세가지 큰 차이점이 있음
- 기본 자료형은 값만 가지지만 객체화된 기본자료형은 값외에도 신원(identity)을 가짐. 따라서, 객체화된 기본 자료형 객체가 두개 있을 때, 그 값은 같더라도 신원이 다를수 있음
- 기본 자료형에 저장되는 값은 전부 기능적으로 완전한 값(fully functional value)이지만, 객체화된 기본 자료형에 저장된 값에는 그외에도 아무 기능도 없는 값(null)이 있다.
- 기본 자료형은 시간이나 공간 요구량 측면에서 일반적으로, 객체화된 기본 자료형 보다 효율적임
항목 | 기본 자료형 | 객체화된 기본자료형 | 비고 |
---|---|---|---|
identity | X | O | 값 or 메모리 참조 값 |
null | X | O | 객체에만 null가능 |
성능, 리소스 | G | B | 객체화된 기본 자료형이 상대적으로 나쁨 |
객체화된 기본 자료형을 사용하는 타당한 용례
- 컬렉션의 요소
- 제네릭에 사용될때
- 리플렉션으로 사용 되기 위해 형인자 자료형(parameterized type)으로 사용될 때(
ThreadLocal<int>
처럼 사용할 수 없음,ThreadLocal<Integer>
으로 사용)
성능상 고려해야 할 점
- 기본 자료형(int)과 객체화된 기본 자료형을 한 연산에서 사용하면 자동으로 객체화된 자료형이 기본자료형으로 변환된다.(auto-unboxing)
public class Unbelievale { static Integer i; public static void main(String[] args) { if (i == 42) // 여기에서 auto-unboxing이 발생(i.intValue())하여 NullPointerException이 발생 System.out.println("Unbelievable"); } }
- 객체화된 기본 자료형은 불변객체(immutable object)이다.
그러므로, 방어적 복사, 객체화와 비 객체화가 반복되므로 루프에서 사용하게 되면 성능에 심각한 문제를 준다.
(기본 자료형을 사용해야 한다면,
IntStream
과 같은 기본 자료형 스트림을 사용하자.)
결론
- 가능하면 기본 자료형 사용
- 객체의 값 비교는
equals
, 기본 자료형의 값 비교는==
- auto-unboxing 시
NullPointerException
를 주의 - 객체화 기본 자료형은 불변 객체이면서, boxing 처리로 인해 성능 이슈가 발생할 소지가 크다.