Java 에서 변수란 데이터를 저장하기 위해 할당된 메모리 공간을 의미한다,
그리고 데이터 타입이란 변수에 적재할 데이터가 메모리에서
어떻게 저장되고 프로그램에서 어떻게 처리해야 하는지 알려주는 키워드를 뜻한다.
데이터 타입은 크게 기본형과 참조형으로 나눌 수 있다.
null 또는 객체의 주소를 가질 수 있다.기본형 타입은 크게 boolean, char, byte, short, int, long, float, double 형이 존재한다.

기본형 타입의 특징으로는 다음과 같다.
동시에 메모리 생성참조형 타입은 위 기본형 타입을 제외한 나머지 기본 제공 클래스, 배열, 열거 타입 모두를 뜻한다.
참조형 타입의 특징으로는 다음과 같다.
메모리의 힙(heap) 에 실제 값을 저장하고, 참조값을 갖는 변수는 스택에 저장| 항목 | 스택 메모리 | 힙 메모리 |
|---|---|---|
| 할당 방식 | 정적(컴파일 시 크기 고정) | 동적(런타임에 필요에 따라 크기 결정) |
| 저장 위치 | 로컬 변수, 매개변수, 메서드 호출 정보 | 객체, 배열 등 참조형 데이터 |
| 메모리 관리 | 자동으로 해제(메서드 종료 시) | 가비지 컬렉터가 관리 |
| 속도 | 빠름 | 상대적으로 느림 |
| 메모리 크기 제한 | 제한적(작음) | 상대적으로 큼 |
| 예외 상황 | StackOverflowError | OutOfMemoryError |
스택 메모리는 메서드가 호출이 되면 고정된 크기의 메모리가 할당되고 메서드가 종료되면 동시에 종료
힙 메모리는 프로그램 실행동안 동적으로 크기를 할당하고 GC가 필요하지 않은 객체를 자동으로 정리
따라서 이 힙 메모리를 사용할 때의 메모리 관리가 매우 중요한 부분이다.
프로그래밍을 하면서 기본타입을 객체로 다뤄야 하는 경우가 빈번하게 발생하는데
이럴 때 사용하는 클래스들은 Wrapper 클래스 라고 한다.
자바의 모든 기본타입은 값을 찾는 객체를 생성할 수 있다.
이런 객체를 포장 객체라고 하는데 기본 타입의 값을 내부에 두고 포장하는 것처럼 보이기 때문이다.
래퍼 클래스는 모두 java.lang 기본 패키지에 포함되어 제공하기 때문에 자유롭게 사용가능하다.

위와 같이 각 타입에 해당하는 데이터를 파라미터로 입력받아 해당 값을 가지는 객체로 변환한다.

자바의 8개 기본 타입에 대한 래퍼 클래스는 위와 같다.

위에서 기본 타입을 래퍼 클래스로 포장하여 객체로 변환하는 작업을 Boxing 이라 한다면
반대로 래퍼 클래스를 기본 타입으로 다시 변환시키는 작업을 UnBoxing 이라한다.
굳이 왜 번거롭게 래퍼 클래스로 변환해놓고 다시 언박싱 작업을 수행하는 걸까?
개발을 하다보면 객체안의 값을 가져와서 가공 즉, 산술 연산을 해야하는 경우가 비일비재하다
래퍼 클래스는 산술 연산을 위해 정의된 클래스가 아니고 주소를 참조하기에
다시 값을 빼서(unboxing) 변형해주는 작업을 거쳐야한다.
JDK 1.5 버전 부터는 박싱과 언박싱이 필요한 상황에 자바 컴파일러가
알아서 처리해주는 기능이 도입되었다.
// 기존 박싱 & 언박싱
Integer num = new Integer(17);
int n = num.intValue();
/* 오토 박싱 & 언박싱 */
Integer num = 17;
int n = num;
Map<Integer, Integer> map = new HashMap<>();
int a = 0;
Map.put(a, 0); // 이런식으로도 자동 적용된다.
기존에는 위와 같이 일일이 번거로운 작업을 거쳐줘야 했다.
참고로 연산자를 통해 같은 값이 들어있는 객체 둘을 비교할 때는
객체의 주소 값을 비교하므로 값이 같더라도 false 가 반환된다.
즉, 동등성을 비교하는게 아니라 동일성을 비교하는 작업.
간단한 작업이라해도 박싱과 언박싱 작업 시 성능에 영향을 미치게 되는데
한 두건이라면 모르겠지만 100만건 이상 씩 작업이 수행된다고 가정해보면
엄청난 성능차이가 발생하게 된다.
따라서 대용량 트래픽이 점점 중요해지는 개발 환경에서
값 타입을 어떻게 설정해주느냐에 따라 성능 차이가 어마어마하게 차이날 수 있기 때문에
반드시 고려해서 사용해야 하는 부분이다.