[JAVA] 래퍼클래스(기본형&참조형)

김채원·2025년 2월 24일
0
post-thumbnail

1.기본형 & 참조형

a. 기본형 (primitive type)

int, long과 같이 변수에 사용할 값을 직접 넣는 데이터타입

b. 참조형(Reference type)

데이터에 접근하기 위한 주소를 저장하는 데이터 타입

  • 변수에 객체가 담기면 해당 변수를 참조형변수라 부름
  • 참조형 변수는 데이터가 저장된 메모리 주소를 가리킴 -> Heap 메모리 주소

2. 래퍼클래스(wrapper class)

a. 래퍼클래스

기본형을 객체로 감싸는 클래스

기본 자료형 (Primitive Type)래퍼 클래스 (Wrapper Class)
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

b.래퍼클래스를 사용하는 이유

  • 기본형은 객체처럼 속성, 기능을 가질 수 x
  • 따라서 기본형을 감싼 객체를 만들어 기능을 제공하면 편리하게 데이터처리를 할 수 있음

3. 오토박싱 & 언박싱

a. 오토박싱

기본형 -> 래퍼형으로 변환하는 과정

Integer num = 10;

위와 같이 원래라면 Integer 객체에 int 값을 바로 넣을 수 없지만
자바에서

Integer num = Integer.valueOf(10);

위 코드처럼 자동으로 처리해줘서 Integer타입으로 바로 변환 가능함
이를 오토박싱 이라고 부름

b.언박싱

래퍼형 → 기본형으로 변환하는 과정
오토박싱과 마찬가지로

Integer num1 = 10; 
int num = num1;

원래 int형 타입 변수를 Integer에 바로 넣어줄 수 없지만

int num1 = num1.intValue();

이렇게 자바에서 위 코드처럼 자동으로 처리해줘 int 타입으로 바로 변환 가능
이를 오토 언박싱 이라고 부름

4. 기본형과 래퍼형의 성능 비교

  • 래퍼형은 내부적으로 데이터를 감싸고 있기때문에 연산시 불리
  • 빠른 작업이 필요한 경우 기본형을 직접 활용하는 것이 좋은 선택
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);
    }
}

이런식으로 조금 많은 양의 데이터를 계산하게 되면

성능의 차이가 꽤 나버린다

5. 개인적 궁금증

그리고 개인적인 궁금증 ,,
사실 실행해봤는데 말이 31배지 나는 큰 차이를 못느꼈다
왜냐면 기본형이 너무 빠른 연산을 해냈기 때문 ,,

그래서 오늘도 귀염둥이 지피티에게 물어본 결과
지피티피셜 문제 될 정도로 느리지는 않다고 한다

근데 이 말을 믿을 수 있냐 하면 기본형은 메모리를 4Byte 사용하지만,
래퍼형은 객체이므로 16Byte~24Byte 사용한다고 한다
메모리 상으로는 4 ~ 6배정도의 차이

그렇다면 1바이트를 연산하는데 컴퓨터는 얼마의 시간이 걸릴까 ?

RAM에서 돌린다고 가정해 1바이트를 처리하는데 100ns가 걸린다고 생각했다
100ns는 0.0000001초이므로
데이터 10만개를 1바이트로 처리하면 0.01초가 걸린다
래퍼형은 16~24바이트를 사용한다 했으므로 가장 크게 잡아도 0.24초
이정도면 사실 지양할것까진 없는것 아닌가?

생각해보면 페이지 3초만 버벅여도 화 잔뜩 나는데
0.24초를 줄이는건 꽤나 큰 일인지도 모르겠다

profile
김채원 판교간다

0개의 댓글