티스토리 뷰

java&spring

[Java] Wrapper Class

sungjine 2017. 1. 11. 17:26
반응형

Wrapper Class는 기본형 타입을 담을 수 있는 객체이다. 즉 Wrapper Class는 기본형 타입이 객체로써 쓰여야 할 때 사용하면 된다.

 

(byte < short < int < long < float < double, character, boolean)

short -> Short

byte -> Byte

int -> Integer

long -> Long

float -> Float

double -> Double

boolean -> Boolean

char -> Character

 

Wrapper Class를 생성할 때 생성할 객체의 기본형 타입을 넣거나 문자열을 넣으면 되는데 Character는 문자열을 넣으면 에러가 난다.

 

Character c1 = new Character("A"); // Error

Character c2 = new Character('A'); // Success

 

short, byte, int, long은 생성할 Wrapper Class보다 큰 기본형 타입을 넣으면 에러가 난다. float이나 double은 어떤 값을 넣어도 에러가 나지 않는다. (Float의 생성자 중 Double을 받는 생성자가 있기 때문)

 

Byte b = new Byte((short)1); // Error

Short s = new Short((int)1); // Error

Integer i = new Integer((long)1); // Error

Long l1 = new Long((float)1); // Error

Long l2 = new Long((double)1); // Error

Float f = new Float((double)1); // Success

Double d = new Double((long)1); // Success

 

boolean은 Wrapper Class의 생성자에 boolean 타입이나 문자열을 넣을 수 있다. 문자열은 true를 제외하면 모두 false를 리턴한다.(true의 대소문자는 상관없다.)

 

Boolean b1 = new Boolean("true"); // true

Boolean b2 = new Boolean("True"); // true

Boolean b3 = new Boolean(true); // true

Boolean b4 = new Boolean("f"); // false

Boolean b5 = new Boolean("0"); // false

Boolean b6 = new Boolean("1"); // false

Boolean b7 = new Boolean(false); // false

 

new 키워드를 이용하지 않아도 valueOf()를 이용하여 객체를 생성할 수 있다.

 

Integer i = Integer.valueOf(1);

Float f = Float.valueOf(1);

Boolean b = Boolean.valueOf(false);

....

 

자바버전 1.5부터는 Auto-Boxing과 Auto-UnBoxing을 제공하여 쉽게 Boxing과 UnBoxing을 할 수 있다.

 

Boxing : 기본형 타입을 Wrapper Class에 담는 것 (ex : Integer i1 = new Integer(1); )

UnBoxing : Wrapper Class에 있는 값을 꺼내는 것 (ex : int i2 = i1.intValue(); )

Auto-Boxing : 자동으로 기본형 타입을 Wrapper Class에 담는 것 (ex : Integer i3 = 1; )

Auto-UnBoxing : 자동으로 Wrapper Class에 있는 값을 꺼내는 것 (ex : int i4 = new Integer(1); )

 

Auto-Boxing과 Auto-UnBoxing은 기본형 타입과 다른 Wrapper Class가 와도 기본형 타입보다 작다면 잘 작동한다.

 

int i = new Long(1); // Error

long l = new Integer(1); // Success

float f = new Long(1); // Success

float f = new Double(1); // Error

double d = new Float(1); // Success

 

Auto-Boxing과 Auto-UnBoxing이 제공됨으로 Wrapper Class와 기본형 타입의 계산이 가능해졌고 값이 같은지도 비교할 수 있다.

 

Integer i1 = new Integer(10);

int i2 = 10;

i1 + i2 // 20

i1 - i2 // 0

i1 * i2 // 100

i1 / i2 // 1

i1 == i2 // true

 

Wrapper Class와 Wrapper Class끼리의 계산도 가능해졌다. 하지만 객체끼리 비교할 때는 equals를 사용해야 한다.

 

Integer i1 = new Integer(10);

Integer i2 = new Integer(10);

i1 + i2 // 20

i1 - i2 // 0

i1 * i2 // 100

i1 / i2 // 1

i1 == i2 // false

i1.equals(i2) // true

 

위와 같은 상황에서 valueOf()를 사용한다면 equals()를 사용하지 않아도 된다. 왜냐하면 Wrapper Class는 내부적으로 캐시가 존재하는데 valueOf()는 캐시를 통해서 객체를 생성하고 new는 캐시를 무시하고 객체를 생성하기 때문이다. 즉 Wrapper Class를 만들 때 valueOf()로 만드는 게 효과적이다.

 

Integer i1 = 10;

Integer i2 = Integer.valueOf(10);

Integer i3 = Integer.valueOf(10);

i1 + i2 // 20

i1 - i2 // 0

i1 * i2 // 100

i1 / i2 // 1

i1 == i2 // true

i2 == i3 // true

 

하지만 Wrapper Class의 캐시는 -128 ~ 127 사이에만 적용하기 때문에 이보다 큰 값을 사용할 때는 결과가 달라진다. (* 객체끼리의 비교일 때만이다. 기본형 타입과 비교하면 UnBoxing이 이루어지기 때문에 true로 나온다.)

 

Integer i1 = 500;

Integer i2 = Integer.valueOf(500);

i1 == i2 // false

 

위 내용을 작성하면서 생긴 궁금증은 valueOf()와 parse...()의 성능 차이이다.

 

찾아보니 valueOf는 객체를 리턴하고 parse...()는 기본형 타입을 리턴한다. 그리고 valueOf는 내부적으로 parse...()를 사용한다. 해서 기본형 타입을 사용할 때는 parse...()를 사용하는 게 좋고 객체를 사용할 때는 valueOf를 사용하는 게 좋을 것 같다.

반응형
댓글
반응형
최근에 올라온 글
Total
Today
Yesterday
글 보관함
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31