1. 원시 타입 (Primitive Types)
예시: int, char, float, boolean, byte, short, long, double
특징
- 간단한 데이터 저장: 원시 타입은 기본적인 데이터 값을 직접 저장합니다.
- 고정된 크기: 각 원시 타입은 고정된 메모리 크기를 차지합니다. 예를 들어, int는 항상 4바이트를 차지합니다.
- 메모리 효율성: 원시 타입은 값 자체를 스택 메모리에 저장하기 때문에 메모리 사용이 효율적이고, 연산 속도가 빠릅니다.
- 값 전달: 원시 타입은 값에 의한 전달(pass by value)이 이루어집니다. 즉, 함수에 전달될 때 값의 복사본이 전달되며, 원래의 값에는 영향을 주지 않습니다.
2. 참조 타입 (Reference Types)
예시: 클래스, 배열, 인터페이스, String (예: String, Integer, ArrayList)
특징
- 객체를 참조: 참조 타입은 객체의 메모리 주소를 참조하여 데이터를 관리합니다. 즉, 실제 데이터는 힙(heap) 메모리에 저장되고, 변수는 이 데이터를 가리키는 주소를 가지고 있습니다.
- 유연성: 참조 타입은 다양한 데이터 구조와 복잡한 객체를 저장할 수 있습니다. 예를 들어, 배열이나 클래스 객체는 모두 참조 타입에 속합니다.
- 값 전달: 참조 타입은 참조에 의한 전달(pass by reference)을 사용합니다. 즉, 함수에 객체의 참조 주소가 전달되며, 이를 통해 객체의 원래 데이터를 수정할 수 있습니다.
- 동적 할당: 참조 타입은 동적으로 메모리를 할당하며, 크기를 필요에 따라 조정할 수 있습니다.
3. Wrapper 클래스 (Wrapper Classes)
예시: Integer, Character, Float, Boolean, Double, Byte, Short, Long
특징
- 기본 타입의 객체화: Wrapper 클래스는 기본 데이터 타입을 객체로 감싸는 클래스입니다. 이를 통해 기본 타입을 객체로 다룰 수 있습니다.
- Java 컬렉션과의 호환성:
Wrapper 클래스는 Java의 컬렉션 프레임워크와 같이 객체를 필요로 하는 곳에서 기본 타입을 사용할 수 있도록 해줍니다. 예를 들어, ArrayList와 같이 객체 타입으로만 이루어진 컬렉션에 기본 타입을 넣을 수 있습니다.
- 유틸리티 메서드: Wrapper 클래스는 기본 데이터 타입이 제공하지 않는 다양한 메서드를 제공합니다. 예를 들어, Integer.parseInt("123")는 문자열을 정수로 변환하는 메서드입니다.
- 자동 박싱/언박싱: Java는 기본 타입과 Wrapper 클래스 간의 자동 변환(Autoboxing/Unboxing)을 지원합니다. 예를 들어, int 값을 Integer로 자동 변환하거나, Integer 객체를 int로 자동 변환할 수 있습니다.
주요 차이점 요약
| 특징 | 원시 타입 (Primitive Types) | 참조 타입 (Reference Types) | Wrapper 클래스 (Wrapper Classes) |
|---|
| 저장 방식 | 값 자체를 저장 | 객체의 참조(메모리 주소)를 저장 | 기본 타입을 객체로 감쌈 |
| 메모리 사용 | 고정된 크기, 메모리 효율적 | 동적 메모리 할당, 더 많은 메모리 사용 | 동적 메모리 할당, 추가적인 오버헤드 |
| 값 전달 방식 | 값에 의한 전달 (Pass by Value) | 참조에 의한 전달 (Pass by Reference) | 참조에 의한 전달 (Pass by Reference) |
| 타입의 본질 | 기본 데이터 타입 (Primitive Type) | 객체, 클래스, 배열, 인터페이스 등 | 기본 타입의 객체화(Reference Type) |
| 예시 | int, char, boolean | String, Array, Class" | "Integer, Character, Boolean |
| 유연성 | 고정적, 제한적 | 유연하고 확장 가능 | 기본 타입과 컬렉션 등 객체 기반 사용에 유연 |
| 사용 목적 | 간단한 데이터 연산, 성능 중시 | 복잡한 데이터 구조 및 객체 지향 프로그래밍 | 기본 타입을 객체로 다루기, 컬렉션 사용 |