[프로그래머스 자바 중급] java.lang 패키지 : 래퍼 클래스(Wrapper Class)와 Boxing

2 분 소요

래퍼 클래스(wrapper class)

  • 기본 타입 데이터를 객체로 포장해주는 클래스
  • 데이터를 인수로 전달받아, 해당 값을 가지는 객체로 만들어준다.
  • 이러한 래퍼 클래스는 모두 java.lang 패키지에 포함되어 제공된다.

  • 자바의 기본 타입과 대응되는 래퍼 클래스들

    기본 타입 래퍼 클래스
    byte Byte
    short Short
    int Integer
    long Long
    float float
    double Double
    char Character
    boolean Boolean

박싱(boxing)과 언박싱(unboxing)

  • 래퍼 클래스는 산술 연산을 위해 정의된 클래스가 아니므로, 인스턴스에 저장된 값을 변경할 수 없다.
  • 단지, 값을 참조하기 위해 새로운 인스턴스를 생성하고, 생성된 인스턴스의 값만을 참조할 수 있다.
  • 기본 타입의 데이터를 래퍼 클래스의 인스턴스로 변환하는 과정을 박싱(boxing)이라고 한다.
    • 기본 타입 데이터를 객체 타입 데이터로 자동 형 변환.
  • 래퍼 클래스의 인스턴스에 저장된 값을 다시 기본 타입의 데이터로 꺼내는 과정을 언박싱(unboxing)이라고 한다.
    • 객체 타입 데이터를 기본형 타입 데이터로 자동 형 변환.

    박싱과 언박싱

오토 박싱(autoboxing)과 오토 언박싱(autounboxing)

  • JDK 1.5부터는 박싱과 언박싱이 필요한 상황에서 자바 컴파일러가 이를 자동으로 처리해준다.
  • 이렇게 자동화된 박싱과 언박싱을 오토 박싱과 오토 언박싱이라고 한다.

  • ex) 박싱과 언박싱, 오토 박싱과 오토 언박싱의 차이

    Integer num = new Integer(17); // 박싱
    int n = num.intValue(); // 언박싱
    System.out.println(n); // 17
      
    Character ch = 'X'; // Character ch = new Character('X'); - 오토박싱
    char c = ch; // char c = ch.charValue(); - 오토언박싱
    System.out.println(c); // X
    
    • 래퍼 클래스에는 intValue(), charValue()와 같은 언박싱을 위한 메소드가 포함되어 있다.
    • 오토 박싱을 이용하면 new 키워드를 사용하지 않고도 자동으로 Character 인스턴스를 생성할 수 있다.
    • 반대로, 오토 언박싱을 이용하여 인스턴스에 저장된 값을 바로 참조할 수 있다.
  • ex) 오토 박싱과 오토 언박싱을 통한 기본 타입과 래퍼 클래스 간의 연산

    public class Wrapper02 {
      public static void main(String[] args) {
        Integer num1 = new Integer(7); // 박싱
        Integer num2 = new Integer(3); // 박싱
          
        int int1 = num1.intValue(); // 언박싱
        int int2 = num2.intValue(); // 언박싱
          
        // 래퍼 클래스를 오토 언박싱하여 기본 타입으로 연산하고, 기본 타입 연산 결과를 오토 박싱
        Integer result1 = num1 + num2; // 10
        // 기본 타입 연산 결과를 오토박싱
        Integer result2 = int1 - int2; // 4
        // 래퍼 클래스를 오토 언박싱하여 기본 타입으로 연산
        int result3 = num1 * int2; // 21
      }
    }
    
    • 내부적으로 래퍼 클래스인 피연산자를 오토언박싱하여 기본 타입끼리의 연산을 수행한다.
  • ex) 래퍼 클래스의 객체 비교

    public class Wrapper03 {
      public static void main(String[] args) {
        // 박싱
        Integer num1 = new Integer(10);
        Integer num2 = new Integer(20);
        Integer num3 = new Integer(10);
          
        System.out.println(num1 < num2); // true, 비교 연산도 오토언박싱을 통해 가능
        System.out.println(num1 == num3); // false, 동등 연산자로 동등 여부 판단 X
        System.out.println(num1.equals(num3)); // true, equals()로 동등 여부 판단
      }
    }
    
    • 래퍼 클래스도 객체이므로 동등 연산자(==)를 사용하게 되면, 두 인스턴스의 주소값을 비교한다.
    • 인스턴스에 저장된 값의 동등 여부를 정확히 판단하려면 equals() 메소드를 사용해야 한다.
  • 💡 래퍼 클래스도 ‘클래스’이기 때문에 속성과 메소드를 가진다.

관련 포스트 - java.lang 패키지

출처