int, long과 같이 변수에 사용할 값을 직접 넣는 데이터타입
데이터에 접근하기 위한 주소를 저장하는 데이터 타입
참조형변수라 부름
기본형을 객체로 감싸는 클래스
| 기본 자료형 (Primitive Type) | 래퍼 클래스 (Wrapper Class) |
|---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
기본형 -> 래퍼형으로 변환하는 과정
Integer num = 10;
위와 같이 원래라면 Integer 객체에 int 값을 바로 넣을 수 없지만
자바에서
Integer num = Integer.valueOf(10);
위 코드처럼 자동으로 처리해줘서 Integer타입으로 바로 변환 가능함
이를 오토박싱 이라고 부름
래퍼형 → 기본형으로 변환하는 과정
오토박싱과 마찬가지로
Integer num1 = 10;
int num = num1;
원래 int형 타입 변수를 Integer에 바로 넣어줄 수 없지만
int num1 = num1.intValue();
이렇게 자바에서 위 코드처럼 자동으로 처리해줘 int 타입으로 바로 변환 가능
이를 오토 언박싱 이라고 부름
public class PrimitiveVsWrapperPerformance {
public static void main(String[] args) {
int iteration = 10_000_000; // 1000만 번 반복
// 기본형 int 연산 성능 테스트
long startTime1 = System.nanoTime();
int sum1 = 0;
for (int i = 0; i < iteration; i++) {
sum1 += i; // 기본형 연산
}
long endTime1 = System.nanoTime();
long primitiveTime = endTime1 - startTime1;
// 래퍼 클래스 Integer 연산 성능 테스트
long startTime2 = System.nanoTime();
Integer sum2 = 0;
for (int i = 0; i < iteration; i++) {
sum2 += i; // 오토박싱 & 언박싱 발생
}
long endTime2 = System.nanoTime();
long wrapperTime = endTime2 - startTime2;
// 결과 출력
System.out.println("기본형(int) 연산 시간: " + primitiveTime + " ns");
System.out.println("래퍼 클래스(Integer) 연산 시간: " + wrapperTime + " ns");
System.out.println("성능 차이 (배수): " + (double) wrapperTime / primitiveTime);
}
}
이런식으로 조금 많은 양의 데이터를 계산하게 되면
성능의 차이가 꽤 나버린다
그리고 개인적인 궁금증 ,,
사실 실행해봤는데 말이 31배지 나는 큰 차이를 못느꼈다
왜냐면 기본형이 너무 빠른 연산을 해냈기 때문 ,,

그래서 오늘도 귀염둥이 지피티에게 물어본 결과
지피티피셜 문제 될 정도로 느리지는 않다고 한다
근데 이 말을 믿을 수 있냐 하면 기본형은 메모리를 4Byte 사용하지만,
래퍼형은 객체이므로 16Byte~24Byte 사용한다고 한다
메모리 상으로는 4 ~ 6배정도의 차이
그렇다면 1바이트를 연산하는데 컴퓨터는 얼마의 시간이 걸릴까 ?

RAM에서 돌린다고 가정해 1바이트를 처리하는데 100ns가 걸린다고 생각했다
100ns는 0.0000001초이므로
데이터 10만개를 1바이트로 처리하면 0.01초가 걸린다
래퍼형은 16~24바이트를 사용한다 했으므로 가장 크게 잡아도 0.24초
이정도면 사실 지양할것까진 없는것 아닌가?
생각해보면 페이지 3초만 버벅여도 화 잔뜩 나는데
0.24초를 줄이는건 꽤나 큰 일인지도 모르겠다