본문 바로가기
개발/Java

Wrapper Class: int와 Integer

by meanjung 2023. 7. 9.

SpringBoot 프로젝트 진행 중 JPA Entity를 설계할 때 int가 아닌 Integer로 하는 것을 보고

그 차이가 정확히 무엇인지, 왜 쓰는지, 어떤 경우에 어떤 것을 쓰는게 좋은지 정리해보고자 한다.

 

자바의 데이터 타입 

1) primitive type

- 정수, 실수, 문자, 논리형의 실제 데이터 값 저장

- boolean, byte, short, int, long, float, double, char

- 실제 값만 저장하기 때문에 스택 메모리에 저장된다.

- 기본값이 설정되어있기에(boolean -> false, int -> 0,,,) Null로 초기화할 수 없다.

2) reference type

- Array, Enum, Class, Interface

- 객체의 주소를 저장. 메모리 번지를 통해 객체를 참조한다.

- 스택에 저장되어 있는 실제 값의 주소를 저장하는 곳으로 힙 메모리에 저장된다.

- Null로 초기화할 수 있다. 

 

Auto Boxing & Auto UnBoxing

다음 코드의 결과가 false가 나와야 할 것 같지만 true가 나온다.

자바에서 auto unboxing해주는 것이다.

Wrapper Class는 Call by Value로 작동한다.

int value = 11;
Integer value2 = new Integer(11);
System.out.println(value == value2); // true
        
char c = 'S';
Character c2 = new Character('S');
System.out.println(c == c2); // true

 

Wrapper Class를 사용하는 이유

  • 매개 변수를 참조 자료형으로만 받는 메소드를 처리하기 위해서
    • Wrapper Class는 기본 데이터 타입을 Object로 변환할 수 있다.  
  • 제네릭과 같이 기본 자료형을 사용하지 않는 기능을 사용하기 위해서
    • 제네릭은 타입 파라미터로 Reference Type 밖에 올 수 없음. Primitive Type 불가
  • MIN_VALUE, MAX_VALUE와 같이 클래스에 선언된 상수값을 사용하기 위해서
    • 기본자료형을 참조자료형으로 만든 클래스들은 Boolean 클래스를 제외하고 모두 MIN_VALUE, MAX_VALUE라는 상수를 갖고 있다.
  • 문자열을 숫자로, 숫자를 문자열로 쉽게 변환하고, 2, 8, 10, 16 진수 변환을 쉽게 처리하기 위해서
  • ArrayList 등과 같은 Collection 프레임 워크의 데이터 구조 기본 타입이 아닌 객체만 저장하게 되고 Wrapper Class를 사용하여 자동 방식과 언박싱이 일어 난다.
  • 멀티스레딩에서 동기화를 지원하려면 객체가 필요하다.
    • synchronized를 적용할 땐 객체변수(Reference Type), 함수 두 가지에서만 가능하다.
    • 즉, primitive type은 reference type으로 만든 다음 synchronized를 적용해야 한다.

 

 

 

 

참고

https://jminc00.tistory.com/13

https://100100e.tistory.com/353

https://earlgreybutter.tistory.com/33

댓글