Java - Primitive vs Wrapper

  • Primitive (원시타입) : byte, short, int, long, float, double, char, boolean, void

  • Wrapper (참조타입) : Byte, Short, Integer, Long, Float, Double, Character, Boolean, Void


1. 원시타입 vs 참조(래퍼)타입

성능 관점

  • 원시타입은 JVM Stack 영역에 존재한다.
  • 참조타입은 참조 값만 Stack 영역에 있고, 실제 값은 Heap 영역에 존재한다.
  • 참조 타입은 최소 메모리 2번의 메모리 접근을 해야하고, 일부 타입의 경우 값 계산을 할 때 언박싱 과정을 거쳐야하므로 원시 타입보다 접근 속도가 느리다.
  • 언박싱(UnBoxing) : Double -> double , Integer -> int


메모리 관점

  • 참조타입이 원시타입보다 사용하는 메모리 양이 압도적으로 높다.
  • 일반적으로 64bit를 차지한다.
  • 그리고 참조타입은 Heap에서 관리하므로 사용하지 않으면 GC에 의해 메모리에서 삭제 대상이 된다.


Null 관점

  • 원시타입은 null을 담을 수 없지만, 참조 타입은 가능하다.
  • 원시타입의 경우 값이 없으면 Default 값을 반환한다. (int는 0, boolean은 false … –> 단 인스턴스 변수일 경우이고, 지역변수는 에러가 발생한다. )


제네릭 관점

  • 원시 타입은 제네릭에서 사용할 수 없다.
  • 참조타입만 사용할 수 있다.




2. 그럼 참조타입은 왜 사용할까?

  • String을 자료형으로 변환할 때 박싱 상태로 변환해야하기 때문이다. 요즘은 valueOf라는 메서드 덕분에 쉽게 String으로 변환이 가능하지만, 내부적으로 보면 오토 언박싱을 하고 변환해주는 것이다.
  • Collections 자료구조의 제네릭에는 참조타입만 들어가기 때문이다.
  • 멀티 스레딩에서 동기화를 지원하려면 객체 타입이 필요하기 때문이다.
  • Null이 필요할 때가 있기 때문이다.




3. Auto Boxing 과 Auto UnBoxing ??

  • 일단 Boxing은 원시 -> 참조, UnBoxing은 참조 -> 원시 로 변환하는 것이다.
  • Auto는 그걸 필요할 때 자동으로 해준다. ( JDK 1.5부터 지원 )
  • 예를들면, 원시타입을 String으로 변환할 때 valueOf를 사용하면 내부적으로 AutoBoxing이 되어서 String으로 변환이 된다.
  • 참조 타입으로 연산을 할 때, 자동으로 Auto UnBoxing이 되어서 값을 계산해준다.






results matching ""

    No results matching ""