목표 : Wrapper Class에 대해 알아보고 코드로 확인해보자.
1️⃣ What
우리가 알고있는 기본형(Primitive) int, boolean, double 등은 객체가 아니다. 객체가 아니기 때문에 메서드도 제공을 못하고 제네릭도 사용할 수 없고 무엇보다 null값을 가질수 없다. 이 기본형의 한계를 해결하기 위해 나타난 것이 Wrapper이다.
💡
“What’s the purpose of a wrapper class?”
→일반 클래스는 객체에서만 작동하며 기본형은 지원하지 않는다. 예를들어, 자바 컬렉션도 오로지 객체와 작동한다.
결과적으로 우리는 기본형을 객체로 바꿔야한다.
2️⃣ How
👉🏻 박싱, 언박싱
Integer intObj=Integer.valueOf(10)
valueOf 내부에서 new Integer(10)을 사용해서 객체를 생성한다. 즉, 객체로 한번 감싸서 반환한다.
성능최적화 기능 : -128~127범위의 Integer클래스를 미리 생성한다. 해당 범위 값 조회하면 미리 생성된 Integer객체 반환, 없으면 새로 new Integer()호출
▶️ factory Method : 지정 값을 나타내는 객체 반환
객체니까 == 비교하면 참조값 비교, 내부값 비교 위해서 equals() 사용
String 은 래퍼클래스가 아니기 때문에, String→ Integer 위해서 parseInt()를 사용해야한다.
int intValue=intObj.intValue()
- 래퍼 클래스에 있는 기본형 값을 다시 꺼내기
👉🏻 오토박싱, 오토언박싱
Integer boxedValue=7;
int unboxedValue=boxedValue;
-------------------------------
Integer boxedValue= Integer.valueOf(7);
int unboxedValue=boxedValue.intValue();
- 컴파일러가 대신 valueOf, xxxValue() 를 추가해준다.
3️⃣ 코드 확인
그럼 진짜 래퍼클래스에는 int로 바꿔주는 코드가 존재할까? Integer클래스를 확인해보자.
ex) Integer
//type
public static final Class<Integer> TYPE = (Class<Integer>) Class.getPrimitiveClass("int");
//toString
public static String toString(int i, int radix)
//parseInt
public static int parseInt(CharSequence s, int beginIndex, int endIndex, int radix)
//valueOf
public static Integer valueOf(String s) throws NumberFormatException ]
//equals
public boolean equals(Object obj)
//hashCode
public int hashCode()
//getInteger
public static Integer getInteger(String nm)
4️⃣ Pros and Cons
👉🏻 장점
- 객체가 제공하는 기능을 사용할 수 있다.
👉🏻 단점
- 메모리를 기본형 보다 더 많이 쓴다. 기본형은 단순히 그 크기만큼 공간을 차지하지만 래퍼클래스는 기본형의 값 뿐만아니라 객체를 다루는데 필요한 객체 메타 데이터를 포함하므로 더 많은 메모리를 사용한다.
⚡ 정리
Wrapper Class
기본형을 객체로 감싸서 그 값에 맞는 객체를 반환하는 클래스