JAVA에서는 총 8가지의 Primitive type을 미리 정의하고 제공한다.
자바에서 기본 자료형은 반드시 사용하기 전에 선언(Declared)되어야 한다. 계산을 위해 실제 값을 저장해야 하기 때문이다.
OS에 따라 자료형의 길이가 변하지 않는다.

비객체 타입이므로 null 값을 가질 수 없으며 기본형에 Null 값을 넣고 싶다면 Wrapper Class를 활용할 수 있다.
스택(Stack) 메모리에 저장됩니다.
8가지 종류
long l = 2147483648; // 컴파일 에러 발생
long l = 2147483648L;float f = 1234.567; // 컴파일 에러 발생
float f = 1234.567F;JAVA에서 Primitive type을 제외한 타입들이 모두 Reference type.
객체의 주소를 저장한다. null 또는 객체의 주소를 갖는다. 즉, 실제 값은 다른 곳에 있으며 값이 있는 주소를 가지고 있어서 나중에 그 주소를 참조해서 값을 가져온다.
Reference type은 JAVA에서 최상인 java.lang.Object클래스를 상속하는 모든 클래스들을 말하며 new로 인하여 생성하는 것들은 메모리 영역인 Heap 영역에 생성을 하게되고, 그 참조값(주소값)을 갖는 변수는 스택에 저장하며 Garbage Collector가 돌면서 메모리를 해제함.

클래스 타입(class type) , 인터페이스 타입(interface type) , 배열 타입(array type) , 열거 타입(enum type)
빈 객체를 의미하는 Null이 존재.
문법상으로는 에러가 없지만 실행시켰을 때 에러가 나는 런타임 에러가 발생하기 때문에 객체나 배열을 Null 값으로 받아 NullPointException이 발생할 수 있으므로 변수 값을 넣어야 함.
Heap 메모리에 생성된 인스턴스는 메소드나 각종 인터페이스에서 접근하기 위해 JVM의 Stack 영역에 존재하는 Frame에 일종의 포인터(C의 포인터와는 다름)인 참조값을 가지고 있어 이를 통해 인스턴스를 핸들링

// 박싱
int i = 10;
Integer num = new Integer(i);
// 언박싱
Integer num = new Integer(10);
int i = num.intValue();
// int i = 5;
Integer iObj = new Integer(7);
// 기본형과 참조형 간의 덧셈 불가
int sum = i + iObj
JDK1.5 전까진 기본형과 참조형의 계산이 불가능했으나, 이후 버전부터 한 쪽을 오토/언박싱하는 방법으로 계산할 수 있도록 컴파일러가 수정됨.

ArrayList<Integer> list = new ArrayList<Integer>();
list.add(new Integer(150)); // 원래는 객체만 넣을 수 있었다.
list.add(100); // 하지만 오토/언박싱 기능이 추가된 이후론 기본값을 넣어도 가능하다.
list.add(200);
Integer i = list.get(0); // list에 저장된 첫번째 객체를 꺼낸다.
int j = list.get(1).intValue(); // intValue()로 Integer를 int로 변환하여 꺼낸다(정석).
int k = list.get(2);
System.out.println("i = " + i);
System.out.println("j = " + j);
System.out.println("k = " + k);
편의성을 위해 오토 박싱과 언박싱이 제공되고 있지만, 내부적으로 추가 연산 작업이 거치게 됨. 따라서, 오토 박싱&언박싱이 일어나지 않도록 동일한 타입 연산이 이루어지도록 구현하며 불필요한 오토 캐스팅이 일어나지 않도록 유의해야 함.
Q: What is boxing and unboxing in Java?
✅ 자바에서 박싱과 언박싱이란 기본형 데이터 타입과 이에 상응하는 래퍼 클래스 간의 변환을 말한다. 박싱은 기본 타입에 해당하는 래퍼클래스로 변환하는 것이며, 언박싱은 래퍼 클래스에서 기본 값을 값으로 추출하는 개념이다.
Q: Before which version of JDK was it impossible to perform calculations between primitive and reference types?
✅ JDK1.5 이전엔 기본형과 참조형 타입간의 계산을 수행하는 것이 불가능했다.
Q: What is AutoBoxing?
✅ 오토 박싱은 기본형 데이터 타입과 이에 상응하는 래퍼 클래스로 자동으로 변환 하는 것을 말한다. 이는 기본형 데이터 값이 직접적으로 래퍼 클래스의 데이터 값으로 변환되는 것을 의미하는데, 객체를 생성하는 수고로움을 덜 수 있다.
Q: What is AutoUnboxing?
✅ 오토 언박싱은 자동으로 래퍼 클래스에서 그에 상응하는 기본형 데이터 타입으로 변환하는 것을 의미한다. 이것은 intValue() 와 같이 기존에 언박싱을 하기 위해 사용하던 메소드 따위를 사용하지 않고도 래퍼 클래스 객체에서 기본 값을 추출할 수 있도록 한다.
Q: Can you provide an example of auto boxing and auto unboxing in Java?
✅ 예를 들어, Integer를 지네릭스로 하는 배열이 있다고 하자. 이때, 해당 배열에 new 객체를 생성해서 Integer를 넣어야 실제 값을 배분할 수 있었지만, 현재는 기본형 데이터 값만 넣더라도 배열에 정상적으로 값이 저장될 수 있다. 이것이 오토박싱이다.
Is there any performance concern related to AutoBoxing and AutoUnboxing?
✅ 오토 박싱과 오토 언박싱은 상당히 편리하지만, 내부적으로 추가적인 연산을 요구하기 때문에 성능에 영향을 미친다. 불필요한 오토 캐스팅은 지양하는 편이 성능 면에서 도움이 된다.
참고자료
[Tech Interview] Primitive type & Reference type
JAVA 변수의 기본형 & 참조형 타입 차이 이해하기
[자바의 정석 - 기초편] ch9-28~31 오토박싱 & 언박싱, 문자열과 숫자변환