JAVA:: Primitive Type vs Wrapper Class

류영준·2022년 10월 29일
0

JAVA

목록 보기
6/9
post-thumbnail

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임을 표현할 수 있다.

결론

  • PK에는 Long(Wrapper Class)을 사용한다.
    • Hibernate JPA 공식문서에서는 Wrapper Class를 권장하고있다.
      • We recommend that you declare consistently-named identifier attributes on persistent classes and that you use a nullable (i.e., non-primitive) type.
    • Wrapper Class를 사용함으로써 Null을 사용하여 명시적으로 PK가 아직 할당되지 않았음을 의미할 수 있다.
  • 일부 필드에서는 Primitive Type도 사용한다.
    • Item의 재고 수량을 나타내는 필드(stockQuantity)로 예를 들면, Null이 필요한 경우도 없고 따로 입력해 주지 않으면 기본값을 0으로 지정해도 문제가 없다.
  • Entity nullable 속성
    int id; // not null로 생성됨. primitive에는 null이 들어갈 수 없기 때문.
    
    Integer id; // nullable true로 생성됨
    
    @Column
    int id; // @Column의 기본값인 nullable=true가 적용되서 nullable=true로 생성됨.
    • @Column 애노테이션이 붙지 않은 Primitive Type의 필드값으로 선언을 하게 되면 not null로 자동으로 설정이 된다.
    • Wrapper Class는 기본값인 nullable=true가 적용된다.
    • 이와 관련해서는 두 가지 타입 쓸 수 있겠지만 통일성의 문제로 보았을 때 Entity에 한해서는 Wrapper Class를 적용해도 괜찮을 거 같다.

참고

https://www.w3schools.com/java/java_wrapper_classes.asp

profile
Backend Developer

0개의 댓글