[ Java ] Wrapper Class 란?

[ Java ] Wrapper Class 란?

·

2 min read

목표 : Wrapper Class에 대해 알아보고 코드로 확인해보자.

출처 : https://www.baeldung.com/java-wrapper-classes

1️⃣ What

우리가 알고있는 기본형(Primitive) int, boolean, double 등은 객체가 아니다. 객체가 아니기 때문에 메서드도 제공을 못하고 제네릭도 사용할 수 없고 무엇보다 null값을 가질수 없다. 이 기본형의 한계를 해결하기 위해 나타난 것이 Wrapper이다.

💡
“What’s the purpose of a wrapper class?”

→일반 클래스는 객체에서만 작동하며 기본형은 지원하지 않는다. 예를들어, 자바 컬렉션도 오로지 객체와 작동한다.

결과적으로 우리는 기본형을 객체로 바꿔야한다.


2️⃣ How

👉🏻 박싱, 언박싱

 Integer intObj=Integer.valueOf(10)
  1. valueOf 내부에서 new Integer(10)을 사용해서 객체를 생성한다. 즉, 객체로 한번 감싸서 반환한다.

  2. 성능최적화 기능 : -128~127범위의 Integer클래스를 미리 생성한다. 해당 범위 값 조회하면 미리 생성된 Integer객체 반환, 없으면 새로 new Integer()호출

    ▶️ factory Method : 지정 값을 나타내는 객체 반환

  3. 객체니까 == 비교하면 참조값 비교, 내부값 비교 위해서 equals() 사용

  4. String 은 래퍼클래스가 아니기 때문에, String→ Integer 위해서 parseInt()를 사용해야한다.

 int intValue=intObj.intValue()
  1. 래퍼 클래스에 있는 기본형 값을 다시 꺼내기

👉🏻 오토박싱, 오토언박싱

Integer boxedValue=7;
int unboxedValue=boxedValue;
-------------------------------
Integer boxedValue= Integer.valueOf(7);
int unboxedValue=boxedValue.intValue();
  1. 컴파일러가 대신 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

👉🏻 장점

  1. 객체가 제공하는 기능을 사용할 수 있다.

👉🏻 단점

  1. 메모리를 기본형 보다 더 많이 쓴다. 기본형은 단순히 그 크기만큼 공간을 차지하지만 래퍼클래스는 기본형의 값 뿐만아니라 객체를 다루는데 필요한 객체 메타 데이터를 포함하므로 더 많은 메모리를 사용한다.

⚡ 정리

Wrapper Class
기본형을 객체로 감싸서 그 값에 맞는 객체를 반환하는 클래스