Language/Java

[JAVA] 래퍼 클래스

leegeonwoo 2024. 6. 24. 22:53

기본형의 한계

  • 객체가 아니기때문에 메서드를 제공할 수 없다
  • null값을 가질 수 없다

래퍼 클래스 생성 - 박싱

  • 기본형을 래퍼클래스로 변경하는 것을 박싱이라고 한다
  • Integer.valueOf(10)을 하면 Integer객체에 들어있는 값을 꺼낼 수 있다.
  • Integer.valueOf()에는 성능최적화가 되어있는데 String pool과 같이 -128~127범위의 숫자는 pool에 미리 생성해두고 가져와서 사용한다.
    때문에 아래와 같은 실행결과를 얻는다
public static void main(String[] args) {  
    Integer i1 = Integer.valueOf(127);  
    Integer i2 = Integer.valueOf(127);  
    System.out.println(i1 == i2);  
    System.out.println(i1.equals(i2));  

    Integer i3 = Integer.valueOf(128);  
    Integer i4 = Integer.valueOf(128);  
    System.out.println(i3 == i4);  
    System.out.println(i3.equals(i4));  
}

//실행결과
true
true
false
true

intValue() - 언박싱

  • 래퍼 클래스에 들어있는 기본형 값을 다시 꺼내는 메서드이다
  • 언방식이라고한다.

오토 박싱

Integer value = 7;  

int num = value;

자바에서는 편리함을위해 오토박싱을 제공하며 컴파일러가 valueOf()메서드와 intValue()메서드를 자동으로 추가해준다.


주요 메서드와 성능

래퍼 클래스 객체는 아래와같은 여러 편의 메서드를 제공한다

Integer integer = Integer.valueOf(10);  
Integer integer2 = Integer.valueOf("10");  
int i = Integer.parseInt("20");  
System.out.println(integer);  
System.out.println(integer2);  
System.out.println(i);  

int result = integer.compareTo(5);  
System.out.println(result);  

int sumResult = Integer.sum(10, 20);  
int minResult = Integer.min(10, 30);  
int maxResult = Integer.max(10, 30);  
System.out.println(sumResult);  
System.out.println(minResult);  
System.out.println(maxResult);



  • valueOf()는 래퍼 타입을 반환
  • parseInt()는 기본형을 반환

기본형과 래퍼 클래스의 성능에는 차이가 있다 때문에 다양한 기능을 제공하는 래퍼 클래스와 기본형을 상황에 맞게 사용할 수 있다

int iterations = 1_000_000_000;  
long startTime, endTime;  

long sumPrimitive= 0;  
startTime = System.currentTimeMillis();  
for (int i = 0; i < iterations; i++) {  
    sumPrimitive += i;  
}  
endTime = System.currentTimeMillis();  
System.out.println(sumPrimitive);  
System.out.println((endTime - startTime) + "ms");  


Long sumWrapper= 0L;  
startTime = System.currentTimeMillis();  
for (int i = 0; i < iterations; i++) {  
    sumWrapper += i;  
}  
endTime = System.currentTimeMillis();  
System.out.println(sumWrapper);  
System.out.println((endTime - startTime) + "ms");

//실행결과
499999999500000000
611ms //primitive
499999999500000000
1473ms //wrapper

약 두 배정도의 성능측면에서의 차이가 나는 것을 실행결과로 확인할 수 있다.

하지만 현실적으로 일반적인 애플리케이션을 구현하는 관점에서는 이 차이는 모래알 하나의 차이일뿐이다
즉, 특수한 경우를 제외하고는 Wrapper와 Primitive의 최적화는 큰 차이가 없다.
때문에 일반적인 경우에는 유지보수에 용이한 타입을 구현하는 것이 좋다.
-> 불필요한 최적화를 할 필요는 없다.

728x90