자바에서는 데이터 타입을 크게 원시 타입(Primitive Type)과 참조 타입(Reference Type)으로 나눌 수 있다.
이 두 타입은 메모리 관리와 작동 방식에서 중요한 차이가 있으며, 오토박싱과 언박싱은 이 두 타입 간의 상호작용을 돕는 중요한 개념이다.
이 글에서는 원시 타입과 참조 타입의 차이, 그리고 오토박싱과 언박싱에 대해 자세히 살펴보겠다.
1. 원시 타입 (Primitive Type)
원시 타입(Primitive Type)은 자바에서 기본적으로 제공하는 타입으로, 가장 간단한 형태의 데이터를 저장하는 데 사용된다. 이 타입은 메모리에서 값 자체를 직접 저장하며, 성능이 뛰어나다. 자바의 원시 타입은 총 8가지이며, 각각의 타입은 고유한 크기와 범위를 가지고 있다.
자바의 원시 타입 8가지
타입 | 크기 | 범위 | 기본값 | 설명 |
boolean | 1비트 | true 또는 false | false | 논리적 참/거짓을 나타냄 |
byte | 8비트 | -128 ~ 127 | 0 | 작은 범위의 정수 값을 저장할 때 사용됨 |
short | 16비트 | -32,768 ~ 32,767 | 0 | 중간 크기의 정수 값을 저장할 때 사용됨 |
int | 32비트 | -2^31 ~ 2^31-1 (약 -21억 ~ 21억) | 0 | 일반적인 정수 값을 저장할 때 사용됨 |
long | 64비트 | -2^63 ~ 2^63-1 (매우 큰 정수 범위) | 0L | 더 큰 범위의 정수 값을 저장할 때 사용됨 |
float | 32비트 | 1.4E-45 ~ 3.4E38 | 0.0f | 단정도 부동 소수점 숫자를 표현 (소수점이 있는 값) |
double | 64비트 | 4.9E-324 ~ 1.7E308 | 0.0d | 배정도 부동 소수점 숫자를 표현 (더 정밀한 소수점 값) |
char | 16비트 | '\u0000' (0) ~ '\uffff' (65535) | '\u0000' | 유니코드 문자를 저장하며, 문자의 숫자 값을 저장할 수도 있음 |
원시 타입의 특징:
- 값 자체를 스택 메모리에 저장.
- Null 값을 가질 수 없음.
- 연산이 빠름, 메모리 효율성이 높음.
- 값 비교 시 값 자체를 비교.
2. 참조 타입 (Reference Type)
참조 타입(Reference Type)은 객체를 참조하는 타입이다. 값이 아닌, 객체가 저장된 메모리의 주소를 저장한다. 자바의 참조 타입에는 클래스, 인터페이스, 배열, 열거형(Enum) 등이 있다. 예를 들어, String과 같은 객체는 참조 타입으로 취급된다.
참조 타입 예시:
String str = new String("Hello");
Integer num = new Integer(10);
참조 타입의 특징:
- 힙 메모리에 저장된 객체를 가리키는 참조(메모리 주소)를 스택에 저장.
- Null 값을 가질 수 있음.
- 값 비교 시 참조(메모리 주소)를 비교. 같은 값을 가진 객체라도 주소가 다르면 다른 객체로 인식.
- 객체 생성 시, 더 많은 메모리를 사용함.
3. 원시 타입과 참조 타입의 차이점
항목 | 원시 타입 (Primitive Type) | 참조 타입 (Reference Type) |
저장 위치 | 스택 메모리 | 힙 메모리에 객체가 저장되고, 참조는 스택에 저장됨 |
데이터 크기 | 고정 크기 (예: int는 4바이트) | 객체마다 다름 (객체의 필드에 따라 달라짐) |
Null 허용 여부 | Null 값을 가질 수 없음 | Null 값을 가질 수 있음 |
기본 값 | 타입에 따른 기본 값 (예: int는 0) | Null |
값 비교 방식 | 값 자체를 비교 | 참조(메모리 주소)를 비교 |
메모리 효율성 | 메모리 사용량이 적음 | 상대적으로 메모리 사용량이 큼 |
성능 | 고속 (직접 값 처리) | 느림 (객체 참조 처리) |
오토박싱/언박싱 | 적용되지 않음 | 원시 타입과 상호작용 시 오토박싱/언박싱 필요 |
사용 용도 | 간단한 값 저장 (숫자, 논리값 등) | 복잡한 데이터 구조나 객체 저장 |
4. 오토박싱(Auto-boxing)과 언박싱(Unboxing)
자바에서는 원시 타입과 참조 타입 간의 상호작용이 필요할 때, 오토박싱과 언박싱이 사용된다. 자바 5부터 자동으로 처리되기 때문에, 개발자가 명시적으로 변환 코드를 작성할 필요가 없다.
4.1. 오토박싱 (Auto-boxing)
오토박싱은 원시 타입을 대응되는 참조 타입(래퍼 클래스)으로 자동 변환하는 과정이다. 예를 들어, int가 Integer 객체로 변환될 때 오토박싱이 일어난다.
예시 코드:
int num = 10;
Integer boxedNum = num; // 오토박싱 발생
4.2. 언박싱 (Unboxing)
언박싱은 참조 타입(래퍼 클래스)을 다시 원시 타입으로 자동 변환하는 과정이다. 즉, Integer 객체가 다시 int로 변환될 때 언박싱이 발생한다.
Integer boxedNum = 10;
int num = boxedNum; // 언박싱 발생
5. 오토박싱과 언박싱의 주의점
오토박싱과 언박싱은 편리하지만 성능에 영향을 미칠 수 있다. 특히, 반복문에서 오토박싱과 언박싱이 빈번히 일어나는 경우, 불필요한 객체 생성과 메모리 사용이 발생할 수 있다.
Integer sum = 0;
for (int i = 0; i < 1000; i++) {
sum += i; // 매번 언박싱 및 오토박싱이 발생
}
위 코드에서 sum += i 부분은 반복할 때마다 sum이 int로 언박싱되고, 다시 Integer로 오토박싱된다. 이러한 불필요한 연산이 성능 저하를 유발할 수 있다.
'Java' 카테고리의 다른 글
[Java] 자바에서의 배열 복사 방법( arraycopy(), copyOfRange(), copyOf() ) (0) | 2024.04.05 |
---|---|
[Java] String.split 함수 (0) | 2024.04.05 |
[Java] 래퍼(Wrapper) 클래스 (0) | 2024.04.05 |