본문 바로가기

Java

자바 Long vs long .. Integer vs int 차이가 궁금하다

자바의 자료형은 크게 기본 타입 (primitive type)과 참조 타입 (reference type) 그리고 null type 으로 나눠집니다.

 

대표적으로 기본 타입은 char, int, float, double, boolean 등이 있고,

참조 타입은 class, interface,enum,array 등이 있는데, 기본타입의 데이터를 객체로 표현해야하는 경우가 있습니다.

 

이럴 때 기본 타입(primitive type)을 클래스(reference type) 처럼 다루기 위해서 Wrapper 클래스를 사용합니다.

 

Integer , Long과 같은 Wrapper 클래스는 int, long 과 비교했을때 값을 비교하려면 equals를 사용해야하고 불변객체이기 때문에 값의 변경이 불가능하여 연산도 불가능하고 새로운 객체를 메모리에서 새로 생성해야 하는 오버헤드가 생긴다.

(물론 java5부터는 Integer과 int간 연산을 auto-boxing을 통해 제공한다)

 

그러면 대체 이걸 왜 사용하나요? 라는 의문이 들수밖에 없다.

 

데이터 변경/수정/연산이 필요가 없는 상황에서 해당 데이터가 정상적으로 입력이 되었는지 null인지 체크가 용이하고  클래스이기 떄문에 toString과 같은 메서드를 통해 손쉽게 문자열로 변환이 가능하다. 

 

화면에서 보낸 request 데이터를 읽거나 db에서 값을 조회할때 null 체크가 용이 할 수 있다.

 

따라서 boxing(박스로 감싸다)과 unboxing(박스를 푼다)의 개념도 이해가 될 것이다.

primitive type -> 클래스로 감싸주어 -> boxing -> wrapper class

reference type -> 클래스를 풀어 -> unboxing -> primitive type