오늘은 wrapper(포장)클레스에 대해서 살펴보도록 하자.
Wrapper클레스란 기본타임(byte,char,short,int,long,float,double,boolean)을 객체로 생성하는 클레스를 말한다. 그리고 이러한 wrapper클레스는 불변객체로써 값을 변경할 수가 없다.
예를 들어, 즉 포장이란 무엇인가? 어떠한 내용물을 담는 상자? 라고 생각하면 쉬울 것이다.
그럼 안의 내용물을 변경하려면 그 포장지를 뜯어야하지 않는가? 포장을 한다는 거 자체가 선물의 의미인데..이것을 바꾸려고 하는것은..(약간..억지의 감이 있지만)
따라서 값을 변경을 하지못하고, 값을 변경하고 싶으면 포장 객체를 생성을 하여야 한다.
기본타입 |
포장 클레스 |
byte |
Byte |
char |
Character |
short |
Short |
int |
Integer |
long |
Long |
float |
Float |
double |
Double |
boolean |
Boolean |
기본 타입 -> 포장 객체 : Boxint(박싱)
포장객체 -> 기본 타입 : Unboxing(언박싱)
package wrapper; public class BoxingUnboxing { public static void main(String[] args) { Integer obj1 = new Integer(100); Integer obj2 = new Integer("100"); Integer obj3 = Integer.valueOf(100); int value1 = obj1.intValue(); int value2 = obj2.intValue(); int value3 = obj3.intValue(); System.out.println(value1); System.out.println(value2); System.out.println(value3); //결과값 //100 //100 //100 } }
* 자동 박싱, 언박싱
박싱에도 자동 형변환처럼 자동적으로 변환을 하는 기능이 있다. 이 기능은 자바5부터 추가된 기능이다.
package wrapper; public class AutoBoxingAutoUnboxing { public static void main(String[] args) { Integer obj1 = 100; //자동 박싱 int value = obj1; //자동 언박싱 System.out.println(obj1.intValue()); System.out.println(value); //결과값 //100 //100 } }
마지막으로 ==,!=의 연산자이다. Wrapper클레스는 객체이기 떄문에 결국 ==,!=연산자는 포장객체의 내부의 값을 비교를 하는것이 아닌 객체의 참조를 비교를 하는것이다. 내부의 값을 비교를 하기위해서는 언박싱을 하여 비교를 하여야 하는데, 예외 적으로 내부의 값을 비교를 하는 짓도 한다..^^
타입 |
값의 범위 |
boolean |
true,false |
char |
\u0000 ~ \u0071 |
byte,short,int |
-128~127 |
왜 이런 현상이 나오는 것일까? 바로 위에 3가지의 기본 타입의 포장클레스의 캐쉬 떄문이다.
각각의 캐쉬를 소스코드로 확인을 해보자.
private static class IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; static { // high value may be configured by property int h = 127; String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) { try { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - (-low) -1); } catch( NumberFormatException nfe) { // If the property cannot be parsed into an int, ignore it. } } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); // range [-128, 127] must be interned (JLS7 5.1.7) assert IntegerCache.high >= 127; } private IntegerCache() {} }
private static class CharacterCache { private CharacterCache(){} static final Character cache[] = new Character[127 + 1]; static { for (int i = 0; i < cache.length; i++) cache[i] = new Character((char)i); } }
'SH.Language > Java' 카테고리의 다른 글
[JAVA] Collection Framework - List 컬렉션(ArrayList, Vector, LinkList) (0) | 2018.01.18 |
---|---|
[JAVA] Collection Framework (0) | 2018.01.17 |
[JAVA] String, StringBuffer, StringBuilder 클레스 (0) | 2018.01.02 |
[JAVA] Class 클레스 - getClasss(), forName(), Reflection(리플렉션), newInstance() (0) | 2017.12.22 |
[JAVA] Object클레스 - clone() (0) | 2017.12.14 |