Java 에서의 Primitive Type vs Wrapper Class
개요
Spring Data JPA를 활용한 프로젝트를 진행하다가 Entity 클래스를 만들고 있었다.
id 필드나 재고를 나타내는 count 필드를 선언하던 와중에 해당 필드 Primitive Type과 Wrapper Class를 사용할 수 있는데, 과연 어떤 것이 더 효율적인지, 어떤 상황에서 사용해야할 지 궁금즘이 생겨 알아보게되었다.
Primitive Type
- 총 8가지의 기본형 타입을 미리 정의하여 제공한다.
- 기본값이 있기 때문에 Null이 존재하지 않는다.
- 만약 기본형 타입에 Null을 넣고 싶다면 래퍼 클래스를 활용한다.
- 실제 값을 저장하는 공간으로 스택(Stack) 메모리에 저장한다.
Wrapper Class
- Wrapper Class는 Primitive Type 등을 객체화한 것이다.
- primitive type을 객체로 한 번 감싼 클래스이다.
- 값이 저장되어 있는 곳의 주소값을 저장하는 공간으로 힙(Heap) 메모리에 저장된다.
- Wrapper Class 변수를 선언하면 힙(Heap) 영역의 주소를 알고있는 레퍼런스가 스택(Stack)에 생긴다.
- 레퍼런스 값 = 힙(Heap) 메모리 공간의 주소
- 실제 데이터는 힙(Heap) 영역에 따로 저장해놓고 JVM & GC의 관리를 받는다.
차이점
- 메소드 호출시 : Primitive Type을 값을 매번 복사하기 때문에 서로 영향을 주지 않지만, Wrapper Class는 레퍼런스(주소값)만 복사하기 때문에 서로 공유된다.
- 재귀 함수 사용시 : Primitive Type은 StackFrame에 데이터가 계속 생성되면서 서로 영향을 주고받지 않는다.
- Immutable : Wrapper Classes 는 근본적으로 Immutable (변경 불가능한) 객체이고 Object 이므로 +1, ++ 같은 사칙연산이 안되는게 원칙이지만, 이걸 인식하지 않고 쓸수 있는 이유는 Java 에서 AutoBoxing/Unboxing 이 지원되고 Equals, HashCode를 재정의 해놓았기 때문이다.

Primitive Type의 장점
- 공유 참조 문제가 없다.
- 메모리의 측면에서 효율적이기 때문에 성능이 조금이라도 더 좋다.
- NPE가 발생하지 않는다.
Wrapper Class 사용시의 장점
- 멀티스레드에서 사용할 수 있다.
- NPE가 발생할 수 있지만, null임을 표현할 수 있다.
결론
참고
https://www.w3schools.com/java/java_wrapper_classes.asp