자바는 객체 지향 언어지만 기본 타입은 객체가 아니다
때문에 다음과 같은 한계가 있다
기본형을 감싸서 만드는 클래스를 래퍼 클래스라고 한다
자바는 기본형에 대흥아는 래퍼 클래스를 기본으로 제공한다
자바가 제공하는 기본 래퍼 클래스는 두 가지 특징이 있다
기본형을 래퍼 클래수로 변경하는 것을 박싱이라고 한다
Integer.valueOf() 를 사용한다
Integer.valueOf() 에는 성능 최적화 기능이 있다
개발자들이 자주 사용하는 -128 ~ 127 범위의 Integer 클래스를 미리 생성해준다
해당 범위의 값을 조회하면 미리 생성된 객체를 반환하고
범위 내에 값이 없으면 new Integer() 를 호출한다
Integer wrappedInt = Integer.valueOf(10); // boxing - Integer 반환
int nomalInt = Integer.parseInt(10); // boxing - int 반환
int primitiveInt = wrappedInt.intValue; // unboxing
래퍼 클래스에 있는 기본형 값을 다시 꺼내는 메서드
래퍼 클래스는 객체이기 때문에 equals() 로 비교한다
각 래퍼 클래스는 toString() 이 오버라이딩 되어 있다
기본형에 래퍼 클래스를 사용할 일이 잦다보니
자바5 (JDK 1.5) 부터 오토 박싱과 오토 언박싱을 지원한다
자바 컴파일러가 기본적으로 박싱과 언박싱을 지원함
오토 박싱 (기본형 → 래퍼 클래스)
래퍼 클래스 타입의 변수에 기본형 값을 할당할 때:
Integer num = 10; // int 기본형 값 10이 Integer 객체로 자동 박싱됩니다.
래퍼 클래스 타입의 메서드 매개변수에 기본형 값을 전달할 때:
public static void printNumber(Integer number) {
System.out.println(number);
}
public static void main(String[] args) {
int value = 5;
printNumber(value); // int 값 5가 Integer 객체로 자동 박싱되어 전달됩니다.
}
컬렉션 프레임워크에서 기본형 값을 저장할 때:
List<Integer> numbers = new ArrayList<>();
numbers.add(100); // int 값 100이 Integer 객체로 자동 박싱되어 List에 추가됩니다.
오토 언박싱 (래퍼 클래스 → 기본형)
기본형 타입의 변수에 래퍼 클래스 객체를 할당할 때:
Integer numObj = new Integer(20);
int num = numObj; // Integer 객체 numObj의 값이 int 기본형으로 자동 언박싱됩니다.
기본형 타입의 메서드 매개변수에 래퍼 클래스 객체를 전달할 때:
public static void add(int a, int b) {
System.out.println(a + b);
}
public static void main(String[] args) {
Integer val1 = new Integer(3);
Integer val2 = new Integer(7);
add(val1, val2); // Integer 객체 val1과 val2의 값이 각각 int 기본형으로 자동 언박싱되어 전달됩니다.
}
산술 연산이나 비교 연산에 래퍼 클래스 객체를 사용할 때:
Integer count = new Integer(5);
int total = count + 2; // Integer 객체 count가 int 기본형으로 자동 언박싱되어 2와 더해집니다.
Integer num1 = new Integer(15);
int num2 = 10;
if (num1 > num2) { // Integer 객체 num1이 int 기본형으로 자동 언박싱되어 num2와 비교됩니다.
System.out.println("num1이 num2보다 큽니다.");
}
배열의 요소로 래퍼 클래스 객체를 사용하고 기본형 타입으로 접근할 때:
Integer[] ages = {new Integer(25), new Integer(30)};
int firstAge = ages[0]; // Integer 객체 ages[0]이 int 기본형으로 자동 언박싱됩니다.
래퍼 클래스는 객체이기 때문에 기본형보다 다양한 기능을 제공한다
하지만 매번 인스턴스를 생성하고 GC 하는 작업에 오버헤드가 크고
인스턴스 내부에 객체 자체를 다루는데 필요한 객체 메타데이터를 포함하므로
메모리도 많이 사용된다
때문에 기본형에 비해 5배 정도 성능이 좋지 않다
하지만 워낙 연산이 빨라서
5배라고 해도 사람이 느낄만큼의 차이를 보이진 않는다
이 경우 10만 번 정도의 반복 작업이 아니라면
유지보수하기 좋은 쪽으로 선택하면 된다
현대의 컴퓨터는 성능이 매우 좋기 때문에
대체로 유지보수 하기 좋은 쪽으로 선택하는 것이 유리하다
대부분의 최적화는 사람이 느낄만큼의 차이를 주지 못한다
유지보수하기 좋은 범위 내에서 추가로 최적화를 한다면
굉장히 좋은 코드가 될 것이다
대부분의 성능 이슈는 네트워크 성능에서 나오기 때문에
네트워크 호출 한 번을 줄이는 것이 다른 최적화보다 좋다
개발 이후 성능 테스트를 한 뒤 정말 문제가 되는 곳은 최적화를 한다