# Wrapper Class

정의

기본 자료타입(primitive type)을 객체로 다루기 위해서 사용하는 클래스들을 래퍼 클래스(wrapper class)라고 합니다.

image

  • 자바는 모든 기본타입(primitive type)은 값을 갖는 객체를 생성할 수 있습니다.
  • 이런 객체를 포장 객체라고도 하는데 그 이유는 기본 타입의 값을 내부에 두고 포장하기 때문입니다.
  • 불변 객체이기 때문에 값에 대한 변경은 불가능하고 새로운 값(객체)의 할당이나 참조만 가능합니다.

# 박싱(Boxing)과 언박싱(UnBoxing)

정의

기본 타입의 값을 포장 객체로 만드는 과정을 박싱이라고 하고 반대로 포장객체에서 기본타입의 값을 얻어내는 과정을 언박싱이라고 합니다.

image

public class Sample {
    public static void main(String[] args)  {
        Integer num = new Integer(25); // 박싱
        int n = num.intValue(); //언박싱
        System.out.println(n);
    }
}

# 자동 박싱(AutoBoxing)과 자동 언박싱(AutoUnBoxing)

public class Sample {
    public static void main(String[] args)  {
        Integer num = 17; // 자동 박싱
        int n = num; //자동 언박싱
        System.out.println(n);
    }
}
  • 자동 박싱의 포장 클래스 타입에 기본값이 대입될 경우에 발생합니다.
  • JDK 1.5부터 지원합니다.

# Wrapper Class를 사용하는 이유

  • 객체로 저장해야 할 경우
  • 매개변수로 객체가 요구될 경우(ex. 제네릭, Collection의 타입)
  • 객체 간의 비교가 필요할 경우
  • 제네릭이나 컬렉션에서 사용할 경우, 기본형을 쓸 수 없기 때문에 이를 Wrapping한 형태를 사용해야 합니다.
  • 기본 자료형의 값을 단순히 값으로만 사용하지 않고 그 값에 대한 메서드를 사용 혹은 null값을 이용하기 위해 사용합니다.
  • Integer Cache라는 곳에서 캐시에 이미 생성한 것이 있으면, 바로 반환하고 아니면 새로 생성합니다.

# Integer의 값 비교하기

Integer.valueOf(127) == Integer.valueOf(127)는 같을까요?

Integer a = 127; 
Integer b = 127;

a == b (true? false?)
  • Integer 클래스는 내부에서 integer 사용을 위해 IntegerCache를 관리합니다.
  • 이 캐시의 기본 범위는 -128 ~ 127이며, Integer.valueOf() 메소드는 캐시 범위에 해당하는 objects를 리턴합니다.
  • 그렇기에, a와 b 둘다, 같은 object 를 가리키게 되므로, a == b가 true가 됩니다.
  • Integer.IntegerCache 처럼 ByteCache, ShortCache, LongCache, CharacterCache도 각각 존재합니다.
    • Byte, Short, Long 타입은 -127부터 127까지의(-127<=, <=127) 고정된 캐시값을 가집니다.
    • 하지만, Character는 0부터 127(0<=, <=127)까지의 고정된 캐시값을 가집니다.

# 참고자료