래퍼 클래스
기본형의 한계
- 객체가 아님: 기본형 데이터는 객체가 아니기 때문에, 객체 지향 프로그래밍의 장점을 살릴 수 없다. 예를 들어 객 체는 유용한 메서드를 제공할 수 있는데, 기본형은 객체가 아니므로 메서드를 제공할 수 없다. 추가로 객체 참조가 필요한 컬렉션 프레임워크를 사용할 수 없다. 그리고 제네릭도 사용할 수 없다.
- null 값을 가질 수 없음 : 기본형 데이터 타입은 ` null` 값을 가질 수 없다. 때로는 데이터가 ` 없음` 이라는 상태를 나 타내야 할 필요가 있는데, 기본형은 항상 값을 가지기 때문에 이런 표현을 할 수 없다
- 기본형을 감싸는 클래스를 만들어 해결할 수 있음
자바 래퍼 클래스
:래퍼 클래스는 기본형의 객체 버전이다.
자바는 기본형에 대응하는 래퍼 클래스를 기본으로 제공한다.
- byte → Byte
- short → Short
- int → Integer
- long → Long
- float → Float
- double → Double
- char → Character
- boolean → Boolean
그리고 자바가 제공하는 기본 래퍼 클래스는 다음과 같은 특징을 가지고 있다.
- 불변이다.
- equals 로 비교해야 한다
박싱(Boxing)
- 기본형을 래퍼 클래스로 변경하는 것
- new Integer(10) 은 제거될 예정이므로 지양.
- Integer.valueOf(10)를 사용하면 된다.
- 최적화: 개발자들이 일반적으로 자주 사용하는 -128 ~ 127 범위의 Integer 클래스를 미리 생성해준다. 해당 범위의 값을 조회하면 미리 생성된 환한다. 해당 범위의 값이 없으면 ` new Integer() ` 를 호출한다. 마치 문자열 풀과 비슷하게 자주 사용하는 숫자를 미리 생성해두고 재사용한다.
- -> 같은 인스턴스를 참조 하므로 == 비교시 true
intValue() - 언박싱(Unboxing)
: 래퍼 클래스에 들어있는 기본형 값을 다시 꺼내는 메서드이다.
비교는 equals() 사용
- 래퍼 클래스는 객체이기 떄문에 == 비교를 사용하면 인스턴스의 참조값을 비교한다.
- 래퍼 클래스는 내부의 값을 비교하도록 equals()를 오버라이딩 해두었다.
오토 박싱(Autoboxing)
: 오토 박싱과 오토 언박싱은 컴파일러가 개발자 대신 valueOf, xxxValue() 등의 코드를 추가해주는 기능
package lang.wrapper;
public class AutoBoxingMain2 {
public static void main(String[] args) {
//Primitive -> Wrapper
int value = 9;
Integer boxedValue = value; //오토 박싱(Auto-boxing)
// Wrapper -> Primitive
int unBoxingValue = boxedValue; //오토 언박싱(Auto-Unboxing)
System.out.println("boxedValue = " + boxedValue);
System.out.println("unBoxingValue = " + unBoxingValue);
}
}
성능
package lang.wrapper;
public class WrapperVsPrimitive {
public static void main(String[] args) {
int iterations = 1_000_000_000; //반복 횟수 설정, 10억
long startTime, endTime;
// 기본형 long 사용
long sumPrimitive = 0;
startTime = System.currentTimeMillis();
for (int i = 0; i < iterations; i++) {
sumPrimitive += i;
}
endTime = System.currentTimeMillis();
System.out.println("sumPrimitive = " + sumPrimitive);
System.out.println("기본 자료형 long 실행 시간: " + (endTime - startTime) + "ms");
// Wrapper 클래스 Long 사용
Long sumWrapper = 0L;
startTime = System.currentTimeMillis();
for (int i = 0; i < iterations; i++) {
sumWrapper += i; //오토 박싱 발생
}
endTime = System.currentTimeMillis();
System.out.println("sumWrapper = " + sumWrapper);
System.out.println("래퍼 클래스 Long 실행 시간: " + (endTime - startTime) + "ms");
}
}
- 기본형은 메모리에서 단순히 그 크기만큼 공간을 차지한다.
- 래퍼 클래스의 인스턴스는 기본형 + 객체를 다루는데 필요한 메타데이터를 포함하므로 더 많은 메모리를 사용함.
- 일반적으로 기본형, 래퍼 클래스의 고민보다 코드의 유지보수하기 더 나은 것을 선택
출처 - 김영한의 실전 자바 중급
'Backend > Java' 카테고리의 다른 글
열거형 - ENUM (0) | 2024.08.09 |
---|---|
Class, System 클래스 (0) | 2024.08.08 |
String 클래스 (0) | 2024.08.07 |
불변객체 (0) | 2024.08.07 |
java.lang (0) | 2024.08.07 |