[Java] 자바 랩퍼(wrapper) 클래스와 boxing / unboxing


랩퍼(wrapper) 클래스

- 자바의 원시 데이터 타입(primitive type)을 다루는 클래스를 의미한다.

 *    byte      ---> java.lang.Byte

 *    short     ---> java.lang.Short

 *    int       ---> java.lang.Integer

 *    long      ---> java.lang.Long

 *    float     ---> java.lang.Float

 *    double    ---> java.lang.Double

 *    boolean   ---> java.lang.Boolean

 *    char      ---> java.lang.Character


왜 이런 클래스를 만들었는가?

- 프로그래밍을 하다보면 원시 데이터 타입의 값을 다뤄야 하는 경우가 있다.

예) Object obj = 20 (x)

     Object obj = new Integer(20); (o)

- 또 산술연산자나 관계연산자, 비트 논리연산자, 논리 연산자, 비트 이동 연산자, 조건

  연산자 외에 추가적인 기능을 클래스에 선언해 두었다.

예) Integer.parseInt(문자열)


- 오토 박싱(auto-boxing) :

  원시 데이터 타입과 랩퍼 클래스 간의 전환을 자동으로 처리하는 것

  ㄴ boxing : 원시 데이터 타입의 값을 랩퍼 클래스의 인스턴스에 담는 것

  ㄴ unboxing : 랩퍼 클래스의 인스턴스에서 원시 데이터 타입의 값을 자동으로 

                     추출하는 것




랩퍼(wrapper) 클래스의 boxing과 unboxing 예제


public static void main(String[] args) {
    int a = 10;
    Integer obj = new Integer(20);
   
    // 개발자가 명시적으로 랩퍼 객체에서 값을 꺼내는 코드
    int b = obj.intValue();
    int c = obj; // auto-unboxing : obj는 주소이지만 랩퍼 객체에서 값을 자동으로 추출해준다.
   
    // 개발자가 명시적으로 랩퍼 객체를 만들어 값을 담기
    Integer obj2 = new Integer(a);
    Integer obj3 = a; // auto-boxing : 원시 타입의 값을 자동으로 랩퍼 객체를 만들어 담는다.

 }





* 참고 : 다음 예제

  String 클래스와 랩퍼(wrapper) 클래스는 StringBuffer 클래스와 달리

  equals() 메서드를 오버라이딩 한다. 전자의 equals()는 주소가 아닌 값을 비교하고

  후자는 Object 클래스의 equals()를 자동으로 상속 받아 주소를 비교한다.




랩퍼(wrapper) 클래스의 equals() 메서드 예제


public static void main(String[] args) {
    Integer i1 = new Integer(10);
    Integer i2 = new Integer(10);
   
    System.out.println(i1 == i2);
    System.out.println(i1.equals(i2));
    System.out.println("---------------------------");
    /* String 클래스와 랩퍼 클래스는 equals() 메서드를 재정의 하였다.
     * => 어떻게?
     *    주소가 아닌 값이 같은지 비교하도록 재정의한다.
     */
   
    StringBuffer s1 = new StringBuffer("Hello");
    StringBuffer s2 = new StringBuffer("Hello");
   
    System.out.println(s1 == s2);
    System.out.println(s1.equals(s2));
    /* StringBuffer 클래스는 equals를 재정의하지 않았다.
     * 그래서 Object에 있는 equals()를 그대로 사용한다.
     * Object의 equals()는 주소를 비교한다. 즉 연산자 == 와 기능이 같다.
     */

  }

- 실행 결과 :

false

true

---------------------------

false

false










블로그 이미지

필로그래머

,