티스토리 뷰
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를 사용하는 게 좋을 것 같다.
'java&spring' 카테고리의 다른 글
java.net.SocketException: Socket closed (0) | 2017.01.24 |
---|---|
[Java] Comparable vs Comparator (0) | 2017.01.16 |
[Java] 연산자 모음 (0) | 2017.01.08 |
[Java] 람다식 (0) | 2016.12.17 |
[Java] 문자열 합치기 비교(StringBuffer,StringBuilder,+연산,concat()) (0) | 2016.12.04 |