본문 바로가기

나의 플랫폼/안드로이드

[Java] Wrapper Class

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Wrapper Class를 이해하는데 좋은 블로그 내용이 있어서 공유 하고자 합니다.


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


자바는 기본형(primitive type), 참조형(reference type) 으로 나뉘는 것은 모두가 아는 사실.

자바를 공부했다 해도 wrapper class가 뭔지 모르는 사람이 은근히?! 있음..

그래서 오늘은 참조형(reference type) wrapper class에 대하여 정리를 해볼까 한다.



wrapper class 

 기본형

래퍼클래스

생성자 

 boolean

Boolean 

Boolean(boolean value)

Boolean(String s) 

 char

Character 

Character(char value) 

 byte

Byte 

Byte(byte value)

Byte(String s) 

 short

Short 

Short(short value)

Short(String s) 

 int

Integer

Integer(int value)

Integer(String s) 

 long

Long

Long(long value)

Long(String s) 

 float

Float

Float(double value)

Float(float value)

Float(String s) 

 double

Double 

Double(double value)

Double(String s) 



Boolean, Character, Number 모두 Object의 자손이며

모슨 숫자와 관련된 wrapper 클래스(Byte. Short, Integer, Long, Float, Double, BigInteger, BigDecimal)들은 모두 Number 클래스의 자손 이다.



wrapper class가 언제 사용이 되냐면.


기본형(primitive type) 변수도 때로는 객체로 다루어져야 하는 경우가 있다.

1. 매개변수로 객체가 요구 될때.

2. 기본형 값이 아닌 객체로 저장해야 할 때.

3. 객체간의 비교가 필요할 때. 등등

이 때 사용되는 것이 wrapper class 이다.



기본형 변수를 객체로 감싸서 객체로 사용할수 있게끔 해서 wrapper 클래스. 그래서 실제로 Integer클래스의 코드를 보면.

아래와 같이 생겼다.


public final class Integer extends Number implements Comparable {

      ...

      private int value;

      ...

 } 


위와 같은 wrapper 클래스들은 모드 equals()가 오버라이딩되어 있어 비교를 해도 주소값이 아닌 객체가 가지고 있는 값을 비교한다.

(toString()도 오버라이딩 되어있어서 객체가 가지고 있는 값이 문자열로 변환하여 반환해줌)

그래서 

Integer i = new Integer(100);

Integer i1 = new Integer(100);

i.equals(i1) -> true 이다


그 밖에도 wrapper 클래스들은 MAX_VALUE, MIN_VALUE, SIZE, TYPE 등의 static 멤버를 공통적으로 가지고 있다.



wrapper 클래스를 몰랐다면.

문자를 숫자로 바꾸거나, 숫자를 문자로 바꾸거나 할때 한번쯤 생각해봤을것 이다 아마..

Integer.parseInt("100") , Integer.valueOf("100") 이 둘의 차이점이 뭔가 싶었을 것.


정리하자면

 문자열 -> 기본형

문자열 -> wrapper 클래스 

 byte b = Byte.parseByte("100");

 Byte b = Byte.valueOf("100");

 short s = Sort.parseShort("100");

 Short s = Short.valueOf("100");

 int i = Integer.parseInt("100");

 Integer i = Integer.valueOf("100");

 long l = Long.parseLong("100");

 Long l = Long.valueOf("100");

 float f = Float.parseFloat("3.14");

 Float f = Float.valueOf("3.14");

 double d = Double.parseDouble("3.14");

 Double d = Double.valueOf("3.14");


wrapper 클래스를 간과 하고 넘어갈만하다.

왜냐하면 JDK 1.5부터 도입되어 지원되는 오토박싱(autoboxing), 언박싱(unboxing) 이 지원됬기 때문이다.


Integer i = new Integer(10);  -> Integer i = 10; //오토박싱(autoboxing)

int i1 = i.intValue();              -> int i1 = i;        //언박싱(unboxing)


그래서 반환값이 기본형일 때와 wrapper 클래스일 때의 차이가 없어졌다.

그래서 구별없이 valueOf()를 쓰는 것도 괜찮은 방법이다.

단, 성능을 비교하자면 valueOf()가 조금 더 느리다.


오토 박싱 언박싱 덕분에 신나게 기본형과 wrapper 클래스 사이를 자유롭게 오갈수 있었다.

아주 편리한 기능이긴 하지만 처음 자바를 배우는 입장에서는 왜 그렇게 되는지 몰르고 아래와 같이 써왔을수 있음.


int i = 10;

Integer i1 = i;


Integer i = 10;


Integer i = new Integer(10);

int i1 = i;


사실 이 기능은 컴파일러가 제공하는 편리한 기능일 뿐 Java의 근본적인 원칙이 바뀐것은 아니다.


 컴파일 전 코드

컴파일 후 코드 

 int i = 10;

 Integer intt = (Integer)i;

 Integer intt = Integer.valueOf(i);

 int i = 10;

 Object obj = (Object)i;

 Object obj = (Object)Integer.valueOf(i);

 Long lng = 100L; 

 Long lng = new Long(100L);

 Integer intt = new Integer(10);
 int i = intt;

 Integer intt = new Integer(10);

 int i = intt.intValue();




출처: http://jusungpark.tistory.com/17 [정리정리정리]


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


Wrapper Class를 정말 많이 사용하고 있었는데, 이게 Wrapper Class 생각하지는 않았었네요.

그냥 int의 클래스는 Integer 이다. 이렇게만 생각하고 있었는데...