1. Java 데이터 타입의 분류
Java의 데이터 타입은 저장 방식과 메모리 모델에 따라 Primitive Type과 Reference Type으로 분류된다.
1.1. Primitive Type (기본형 타입)
- 정의: 데이터의 실제 값(Value)을 변수 내에 직접 저장하는 타입.
- 특징:
- 메모리의 스택(Stack) 영역에 값이 할당된다.
- null 값을 허용하지 않으며, 선언 시 각 타입의 기본값(e.g., int는 0, boolean은 false)으로 초기화된다.
- 접근 속도가 빠르다.
- 종류: Java에는 총 8개의 Primitive Type이 사전에 정의되어 있다.
| 타입 | 크기 | 기본값 | 설명 |
| boolean | 1 bit | false | 참 또는 거짓 |
| byte | 1 byte | 0 | 바이트 단위 정수 |
| char | 2 bytes | \u0000 | 문자 |
| short | 2 bytes | 0 | 단정밀도 정수 |
| int | 4 bytes | 0 | 정수 |
| long | 8 bytes | 0L | 장정밀도 정수 |
| float | 4 bytes | 0.0f | 단정밀도 실수 |
| double | 8 bytes | 0.0d | 배정밀도 실수 |
1.2. Reference Type (참조형 타입)
- 정의: 객체(Object)의 실제 데이터가 저장된 힙(Heap) 메모리 영역의 주소(Reference)를 저장하는 타입.
- 특징:
- 변수는 스택(Stack) 영역에, 실제 객체는 힙(Heap) 영역에 할당된다.
- null 값을 허용하며, 이는 변수가 어떠한 객체도 참조하고 있지 않음을 의미한다.
- 기본형을 제외한 모든 클래스, 인터페이스, 배열, 열거형(Enum)이 이에 해당한다.
2. Wrapper Class
Wrapper Class는 Primitive Type을 객체로 다루기 위해 사용하는 특수한 목적의 Reference Type이다.
2.1. 정의
8개의 Primitive Type 각각에 1:1로 대응하여, 해당 값을 객체 형태로 감싸는(Wrap) 클래스. int에 대응하는 Integer, char에 대응하는 Integer, Character 등이 있다.
2.2. 주요 목적
- 제네릭(Generic) 타입 활용: 컬렉션 프레임워크(ArrayList<T>, HashMap<K, V>) 등 제네릭 타입 파라미터에는 Reference Type만 지정할 수 있다. ArrayList<Integer>와 같이 Primitive Type을 객체 컨텍스트에서 사용하기 위해 Wrapper Class가 필수적이다.
- null 값 표현: Primitive Type은 null을 표현할 수 없으나, Wrapper Class는 null 참조를 통해 '값이 존재하지 않음' 상태를 명시적으로 나타낼 수 있다. 이는 데이터베이스 연동 시 유용하게 사용된다.
2.3. Autoboxing 및 Unboxing
- Autoboxing: Primitive Type 값을 해당하는 Wrapper Class 객체로 자동 변환하는 기능. (int → Integer)
- Unboxing: Wrapper Class 객체에서 Primitive Type 값을 자동으로 추출하는 기능. (Integer → int)
// Autoboxing: 컴파일러가 Integer.valueOf(100)으로 처리
Integer integerObj = 100;
// Unboxing: 컴파일러가 integerObj.intValue()로 처리
int intValue = integerObj;
3. 타입 관계 및 변환 규칙 요약
| 비교 항목 | Primitive vs. Reference | Primitive vs. Wrapper |
| 비교 관점 | 데이터 저장 방식 (값 vs. 주소) 및 메모리 구조 | 실용적 목적 (순수 연산 vs. 객체 기능 활용) |
| 관계 | Java 데이터 타입의 최상위 분류 | Primitive Type과 그에 대응하는 특정 Reference Type의 관계 |
| 형변환 | int → double과 같이 확대 변환(Widening) 규칙을 따름 | Integer와 Double은 상속 관계가 없어 직접 변환이 불가. |
Integer 객체를 Double 타입으로 변환해야 할 경우, integer.doubleValue() 메서드를 사용하거나 (double)integer와 같이 Unboxing을 유도한 후 캐스팅해야 한다. 이는 객체의 형변환이 상속 계층 구조를 따르기 때문이며, Integer와 Double은 상속 관계에 있지 않기 때문에 형변환이 불가능하다.
'JAVA' 카테고리의 다른 글
| Serializable (0) | 2025.12.04 |
|---|---|
| about JVM (0) | 2025.09.30 |
| JDK, JRE, JVM (0) | 2025.09.30 |
| 자바의 hashCode(), hash()에 대하여 (0) | 2025.03.10 |