[JAVA] Wrapper class 란? 그리고 AutoBoxing[JAVA] Wrapper class 란? 그리고 AutoBoxing

Posted at 2013.11.30 12:27 | Posted in == JAVA ==/JAVA



facebook에 글올리기



Wrapper class 란? 그리고 AutoBoxing


Java는 데이터를 클래스나 객체 외에 (int, double, char 및 boolean과 같은) 기초 타입을 가진다.


따라서 Java에서는 기본형 타입과 객체 참조 같은 두가지 타입의 관리 데이터를 가지게 된다. 


예를 들어 데이터를 저장할 때, 기본형 타입의 변수에 저장할 수 있고, 다양한 객체들을 저장할 수 있는 컨테이너 역할을 하는 객체를 생성할 수도 있다.


그러나 어떤 상황에서는 기본형 타입을 객체로 사용해야 하는 경우가 있다. 이러한 경우에 기본형 타입 값을 객체로 포장할 필요가 있다.


포장 클래스(wrapper class)는 특정 기본형 타입을 나타낸다. 예를 들어 Integer 클래스는 간단한 정수 값을 나타낸다.


Integer 클래스로부터 생성된 객체는 하나의 int 값을 저장할 수 있다. Wrapper class의 구성자는 저장할 기본형 타입 값을 받는다.


Integer age = new Integer(30);

Double avg = new  Double("3.145");


Integer 선언으로 객체가 선언되면 age 객체는 정수 30을 객체로 나타내며 기본형 타입이 아닌 객체가 필요한 곳에 사용될 수 있다.



Java의 각 기초 타입에 대해 Java 클래스 라이브러리 내에 상응되는 wrapper class가 존재한다. 모든 wrapper class는 java.lang 패키지에 정의된다.



* Java 클래스 라이브러리의 wrapper class


 기본형 타입

wrapper class 

byte 

Byte 

short 

Short 

int 

Integer 

long 

Long 

float 

Float 

double 

Double 

char 

Charater 

boolean 

Boolean 

void 

Void 


void 타입을 나타내는 wrapper class 도 존재하는 것을 볼 수 있다. 그러나 다른 wrapper class와 달리 void 클래스는 실체화될 수 없으며 단지 공 참조 개념을 나타낸다.



* Boxing 과 UnBoxing


Wrapper 클래스는 산술연산을 위해 정의된 클래스가 아니기 때문에, 이 클래스의 인스턴스에 저장된 값은 변경이 불가능하며, 값을 저장하는 새로운 객체의 생성 및 참조만 가능하다.



- Boxing : 기본 자료형을 Wrapper 클래스의 객체로 변경하는 과정


ex) Integer age = new Integer(30);


- Unboxing : 각각의 객체를 기본 자료형으로 변경하여 사용하는 과정


ex) int age2 = age.intValue();



* AutoBoxing, AutoUnBoxing


JDK 1.5 버전 이후에는 자동으로 Boxing과 UnBoxing을 처리하도록 AutoBoxing 과 AutoUnBoxing을 제공한다.


- AutoBoxing


Integer obj = 61;


숫자 61을 Integer 객체에 넣기 위해서는(Boxing) new Integer(61) 과 같이 객체를 생성해야 하지만, 위와 같이 대입하면 AutoBoxing이 자동으로 진행된다.


- AutoUnBoxing


Integer obj2 = new Integer(69);

int num1 = obj2;


Integer 객체에 있는 int 값을 가져오기 위해서는(UnBoxing) obj2.intValue() 메소드를 사용하여 가져와야 하지만, 위와 같이 int 형 변수에 Integer 객체를 대입하면 자동으로 UnBoxing이 진행된다.



* AutoBoxing과 AutoUnBoxing 은 단지 기본형 타입과 상응하는 Wrapper class에만 일어난다. 다른 경우에 대입을 시도하면 컴파일 에러가 발생한다.

- IntegerintValue(), DoubledoubleValue() 등만 AutoBoxing과 AutoUnBoxing이 발생한다.


ex> Double obj = 3.14;

      int num1 = obj.intValue() ;   (O)

 int num1 = obj;                   (X)



* Wrapper 클래스의 기본 메소드들


 메소드

반환값 

설명 

 booleanValue()

boolean 

기본형 데이터를 문자열로 바꾼 뒤에 반환 

 byteValue()

byte 

객체의 값을 byte 값으로 변환하여 반환 

doubleValue() 

double 

객체의 값을 double 값으로 변환하여 반환 

floatValue() 

float

객체의 값을 float 값으로 변환하여 반환 

intValue() 

int 

객체의 값을 int 값으로 변환하여 반환 

longValue() 

long 

객체의 값을 long 값으로 변환하여 반환 

 shortValue()

short 

객체의 값을 short 값으로 변환하여 반환 


Wrapper class 객체에서 해당 메소드를 사용은 형변환이 가능한 메소드만 사용이 가능하다.


[JAVA] 기본 데이터 타입과 변환



JAVA API DOC : Byte, Short, Integer, Long, Float, Double, Character, Boolean, Void 



'== JAVA == > JAVA' 카테고리의 다른 글

[JAVA] Array 배열, 이중 배열, 다중 배열  (2) 2013.12.04
[JAVA] 열거타입 enum  (2) 2013.12.03
[JAVA] Wrapper class 란? 그리고 AutoBoxing  (3) 2013.11.30
[JAVA] DecimalFormat 클래스  (0) 2013.11.24
[JAVA] NumberFormat 클래스  (1) 2013.11.24
[JAVA] Math 클래스  (1) 2013.11.24
이웃추가
facebook에 글올리기
  1. rkdgusrnrlrl
    안녕하세요 글 잘봤습니다. 제가 궁금하게 있어 질문은 남깁니다. Integer a = 10; 해서 a라는 Interger 타입의 클래스에 10라는 데이터를 담았습니다. 그리고 그 a의 주소값은 Integer b 에게 넘겨주려고 합니다. 기본적인 클래스의 방식 대로라면 Integer b = a; 이겠지만 이렇게 하면 값(10)이 넘어가 버립니다. 제가 원하는 것은 a 와 b 는 같은 주소를 공유해 a의 값에 변화가 생기면 b의 값에 변화를 주고 싶습니다. 그래서 a.hashcode(); 도 사용해봤는데 주소 값이 아닌 데이터 값이 10을 반환하더군요. a의 주소값은 얻어와 b에 그 주소값으로 설정해 줄수 있는 방법이 없을까요??
    • froggy
      2015.04.08 17:15 [Edit/Del]
      wrapper 클래스는 기본적으로 auto-boxing, unboxing 이라는 기능을 제공합니다. (Java5 부터 제공)

      만약 아래와 같이 하면

      Integer a = 10;

      wrapper 클래스 변수 a 에 값을 넣을때 (정확히는 auto-boxing될때)
      10 은 heap 에 생성되는 '리터럴'이고 a 는 리터럴 10 을 레퍼런싱 합니다.

      만약 이 직후에

      Integer b = 10;

      이라 하면, 이 순간만큼은 a 와 b 의 레퍼런스값(id값) 이 동일합니다 (왜나하면 동일한 리터럴 값이기 때문에)


      그러나 다시,

      a = 20; 이라 하면 // (auto-boxing)

      20 이란 리터럴이 heap 에 새로 생성되고, a 는 새로이 생성된 20을 레퍼런싱 하고, b 와는 다른 id 를 갖게 됩니다.
      (wrapper 클래스는 immutable 하니까요.)

      위에서 물어보신.

      Integer b = a;

      위와 같이 하면
      먼저 a 가 auto-unboxing 이 발생하여, a 의 레퍼런스 값이 아닌 a 의 value 인 10 이 나오고
      다시 이 10 이 b 로 auto-boxing 되어 들어가게 됩니다.

      연산자 오버로딩이 원칙적으로 제공되지 않는 자바에서 wrapper 클래스에게만 적용된 특이한 성질이라 보시면 될듯 합니다. (따라서 wrapper 클래스는 상속도 안되게 되어 있습니다. final !)

  2. wkdgusdn3
    Character인데 charater로 오타났습니다~

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기