β μλ° Wrapper ν΄λμ€μ Boxing & UnBoxing μ΄μ 리
λνΌ ν΄λμ€ (Wrapper Class)
μ΄μ κ°μκΈμμ μ°λ¦¬λ μλ°μ μλ£νμ κΈ°λ³Έ νμ (primitive type)κ³Ό μ°Έμ‘° νμ (reference type) μΌλ‘ λλμ΄μ§κ³ κ° νΉμ§μ λν΄ μμ보μλ€.
νλ‘κ·Έλλ°μ νλ€ λ³΄λ©΄ κΈ°λ³Έ νμ μ λ°μ΄ν°λ₯Ό κ°μ²΄λ‘ ννν΄μΌ νλ κ²½μ°κ° μ’ μ’ μκΈ°κ² λλ€.
μλ₯Ό λ€μ΄ λ©μλμ μΈμλ‘ κ°μ²΄ νμ λ§μ΄ μꡬλλ©΄, κΈ°λ³Έ νμ μ λ°μ΄ν°λ₯Ό κ·Έλλ‘ μ¬μ©ν μ μκΈ° λλ¬Έμ μ΄λ ν λ³ν μμ μ΄ νμν΄ μ§λ€.
λν λ©ν°μ€λ λ νκ²½μμ λκΈ°ν λ°μ΄ν°λ₯Ό μ¬μ©ν΄μΌ ν κ²½μ° μ΄λ₯Ό κ°μ²΄ν ν΄μΌ ν νμμ±μ΄ μκΈ΄λ€.
μ΄λ΄ λμ κΈ°λ³Έ νμ (primitive type)μ κ°μ²΄λ‘ λ€λ£¨κΈ° μν΄μ μ¬μ©νλ ν΄λμ€λ€μ λνΌ ν΄λμ€(wrapper class)λΌκ³ νλ€.
μλ°λ λͺ¨λ κΈ°λ³Ένμ (primitive type)μ κ°μ κ°λ κ°μ²΄λ₯Ό μμ±ν μ μλ€.
μ΄λ° κ°μ²΄λ₯Ό ν¬μ₯ κ°μ²΄λΌκ³ λ νλλ°, κΈ°λ³Έ νμ μ κ°μ λ΄λΆμ λκ³ ν¬μ₯νλ κ²μ²λΌ 보μ΄κΈ° λλ¬Έμ΄λ€.
ν¬μ₯λ 물건μ λ°κΏμ μλ―μ΄, λνΌ ν΄λμ€λ‘ κ°μΈκ³ μλ κΈ°λ³Έ νμ κ°μ μΈλΆμμ λ³κ²½ν μ μλ€.
λ§μ½ κ°μ λ³κ²½νκ³ μΆλ€λ©΄ μλ‘μ΄ ν¬μ₯ κ°μ²΄λ₯Ό λ§λ€μ΄μΌ νλ€.
λνΌ ν΄λμ€λ λͺ¨λ java.lang ν¨ν€μ§μ ν¬ν¨λμ΄ μ 곡λλ€.
κ·Έλμ λ³λ€λ₯Έ ν¨ν€μ§ λΆλ¬μ€κΈ° μμ΄ κ³§λ°λ‘ μμ€ λ¨μμ μ¬μ©μ΄ κ°λ₯νλ€.
λνΌ ν΄λμ€λ₯Ό μ΄μ©νλ©΄ κ° νμ μ ν΄λΉνλ λ°μ΄ν°λ₯Ό νλΌλ―Έν°λ‘ μ λ¬λ°μ ν΄λΉ κ°μ κ°μ§λ κ°μ²΄λ‘ λ§λ€μ΄μ€λ€.
Integer num1 = new Integer(5); // κΈ°λ³Έν νμ
μ μλ₯Ό λνΌ ν΄λμ€λ‘ κ°μΈ κ°μ²΄ν
Integer num1 = 5; // μ΄λ°μμΌλ‘λ νν κ°λ₯
Double num2 = new Double(1.11); // κΈ°λ³Έν νμ
μ€μλ₯Ό λνΌ ν΄λμ€λ‘ κ°μΈ κ°μ²΄ν
Double num2 = 1.11;
μλ°μ 8κ°μ κΈ°λ³Έ νμ μ λν λνΌ ν΄λμ€λ λ€μκ³Ό κ°λ€.
κΈ°λ³Έ νμ | λνΌ ν΄λμ€ |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
λλΆλΆμ λνΌ ν΄λμ€λ κΈ°λ³Έ νμ μ 첫 λ²μ§Έ λ¨μ΄λ₯Ό λλ¬Έμλ‘ λ°κΏμ€ μ΄λ¦μΌλ‘ λμ΄μμ§λ§, μ΄ μ€μμ Integer μ Character ν΄λμ€λ§μ΄ μμ μ κΈ°λ³Έ νμ κ³Ό μ΄λ¦μ΄ μ½κ° λ€λ₯΄λ€λ μ μ μ μνμ.
λ°μ±(Boxing) & μΈλ°μ±(UnBoxing)
μμμ λνΌ ν΄λμ€λ κ°μ ν¬μ₯νμ¬ κ°μ²΄λ‘ λ§λλ κ²μ΄λΌκ³ νλ€.
κ°μ ν¬μ₯νμ¬ κ°μ²΄λ‘ λ§λλ κ² κΉμ§λ μ’μ§λ§, λ§μΌ κ°μ λνκ±°λ λ± λ³νμμΌμΌ ν νμκ° μκΈΈ κ²½μ° ν¬μ₯μ λ€μ λ―μ νμκ° μλ€.
μ΄λ¬ν νμλ₯Ό μ λ¬Έμ μΈ μ©μ΄λ‘ λ§νμλ©΄, λ°μ±(Boxing) κ³Ό μΈλ°μ±(UnBoxing) μ΄λΌκ³ νλ€.
- Boxing : κΈ°λ³Έ νμ μ λ°μ΄ν° → λνΌ ν΄λμ€μ μΈμ€ν΄μ€λ‘ λ³ν
- UnBoxing : λνΌ ν΄λμ€μ μΈμ€ν΄μ€μ μ μ₯λ κ° → κΈ°λ³Έ νμ μ λ°μ΄ν°λ‘ λ³ν
λνΌ ν΄λμ€λ μ°μ μ°μ΄μ μν΄ μ μλ ν΄λμ€κ° μλλ€.
μμ±λ μΈμ€ν΄μ€μ κ°λ§μ μ°Έμ‘°ν μ μκΈ° λλ¬Έμ λ°λΌμ λνΌ ν΄λμ€ μΈμ€ν΄μ€μ μ μ₯λ κ°μ μ§μ λ³κ²½μ΄ λΆκ°λ₯νλ€.
κ·Έλμ λνΌ ν΄λμ€λ₯Ό μΈλ°μ± ν λ€μ κ°μ λ³κ²½ν λ€ λ°μ±ν΄μΌ νλ μ€κ° λ¨κ³λ₯Ό κ±°μΉ νμκ° μλ€.
// λ°μ±
Integer num = new Integer(20); // Integer λνΌ ν΄λμ€ num μ 21 μ κ°μ μ μ₯
// μΈλ°μ± (intValue)
int n = num.intValue(); // λνΌ ν΄λμ€ num μ κ°μ κΊΌλ΄ κ°μ Έμ¨λ€.
// μ¬ ν¬μ₯(λ°μ±)
n = n + 100; // 120
num = new Integer(n);
κ° Wrapper νμ μ ν΄λμ€μ μΈλ°μ± λ©μλλ€ λ€μκ³Ό κ°λ€.
λ©μλ | λ°νκ° | μ€λͺ |
booleanValue() | boolean | κΈ°λ³Έν λ°μ΄ν°λ₯Ό λ¬Έμμ΄λ‘ λ°κΎΌ λ€μ λ°ν |
byteValue() | byte | κ°μ²΄μ κ°μ byte κ°μΌλ‘ λ³ννμ¬ λ°ν |
doubleValue() | double | κ°μ²΄μ κ°μ double κ°μΌλ‘ λ³ννμ¬ λ°ν |
floatValue() | float | κ°μ²΄μ κ°μ float κ°μΌλ‘ λ³ννμ¬ λ°ν |
intValue() | int | κ°μ²΄μ κ°μ int κ°μΌλ‘ λ³ννμ¬ λ°ν |
longValue() | long | κ°μ²΄μ κ°μ long κ°μΌλ‘ λ³ννμ¬ λ°ν |
shortValue() | short | κ°μ²΄μ κ°μ short κ°μΌλ‘ λ³ννμ¬ λ°ν |
μλ λ°μ±(AutoBoxing) & μλ μΈλ°μ±(AutoUnBoxing)
JDK 1.5 λΆν°λ λ°μ±κ³Ό μΈλ°μ±μ΄ νμν μν©μ μλ° μ»΄νμΌλ¬κ° μλμΌλ‘ μ²λ¦¬ν΄μ£ΌκΈ° μμνλ€.
μ΄λ¬ν μλνλ λ°μ±κ³Ό μΈλ°μ±μ μ€ν λ°μ± (AutoBoxing) κ³Ό μ€ν μΈλ°μ± (AutoUnBoxing) μ΄λΌκ³ λΆλ₯Έλ€.
κΈ°λ³Ένμ κ°μ μ§μ λ°μ±, μΈλ°μ±νμ§ μμλ λνΌ ν΄λμ€ λ³μμ λμ λ§ νλ©΄ μλμΌλ‘ λ°μ±κ³Ό μΈλ°μ±μ΄ λλ€.
/* κΈ°μ‘΄ λ°μ± & μΈλ°μ± */
Integer num = new Integer(17); // λ°μ±
int n = num.intValue(); // μΈλ°μ±
/* μ€ν λ°μ± & μΈλ°μ± */
Integer num = 17; // new Integer() μλ΅
int n = num; // intValue() μλ΅
μ΄μ²λΌ μ€ν λ°μ±μ μ΄μ©νλ©΄ new ν€μλλ₯Ό μ¬μ©νμ§ μκ³ λ μλμΌλ‘ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μμΌλ©°, μΈλ°μ± λ©μλλ₯Ό μ¬μ©νμ§ μκ³ λ, μ€ν μΈλ°μ±μ μ΄μ©νμ¬ μΈμ€ν΄μ€μ μ μ₯λ κ°μ λ°λ‘ μ°Έμ‘°ν μ μκ² λλ€.
λνΌ ν΄λμ€ μ°μ°
μ€ν λ°μ± & μΈλ°μ± κΈ°λ₯μ μ΄μ©ν΄ λ€μκ³Ό κ°μ΄ λνΌ κ°μ²΄λ₯Ό μ§μ μ°μ°μ΄ κ°λ₯ν΄μ§κ² λλ€.
μλλ λνΌ ν΄λμ€λ μ§μ μ°μ°μ΄ λΆκ°λ₯ νμ§λ§ μ»΄νμΌλ¬κ° μ€μ€λ‘ νλ¨ν΄ μλμΌλ‘ μΈλ°μ±νμ¬ μ°μ° νκΈ° λλ¬Έμ λ€μ κ΅¬λ¬Έμ΄ νμ©λλ κ²μ΄λ€.
Integer num1 = new Integer(7); // λ°μ±
Integer num2 = new Integer(3); // λ°μ±
int int1 = num1.intValue(); // μΈλ°μ±
int int2 = num2.intValue(); // μΈλ°μ±
// λ°μ±λ κ°μ²΄λ₯Ό μ€ν μΈλ°μ±νμ¬ μ°μ°νκ³ λ€μ λ°μ±νμ¬ μ μ₯
Integer result1 = num1 + num2; // 10
Integer result2 = int1 - int2; // 4
int result3 = num1 * int2; // 21
[ NullPointException μλ¬ ]
λνΌ κ°μ²΄λ₯Ό λ€λ£°λ κ°μ₯ λ§μ΄ λ³΄κ² λ μλ¬ μμΈ λ©μΈμ§ μΌ κ²μ΄λ€.
null κ°μ κ°μ§λ wrapper ν΄λμ€ κ°μ²΄μ κΈ°λ³Έν(primitive type) κ°μ μ°μ°ν κ²½μ°, NullPointExceptionμ΄ λ°μνκ² λλ€.
μ΄λ νΌμ°μ°μμ κΈ°λ³Έν int κ°μ΄ μ‘΄μ¬νμ¬ wrapper ν΄λμ€ κ°μ²΄λ₯Ό auto unboxing νλ μ€μ λ°μνλ μλ¬μ΄λ€.
λνΌ ν΄λμ€ λλ± λΉκ΅
μ€ν μΈλ°μ±μ ν΅ν΄ κ°μ²΄ κ°μ λνκ³ λΉΌκ³ λ λ¬Έμ λ μμ§λ§, κ°μ²΄ κ°μ λΉκ΅λ₯Ό ν λλ μ‘°μ¬ν΄μΌ νλ€.
μΈμ€ν΄μ€μ μ μ₯λ κ°μ λν λλ± μ¬λΆ νλ¨μ λλ± μ°μ°μ == μΌλ‘λ κ°μ λΉκ΅νλκ² μλ κ°μ²΄μ μ£Όμκ°μ λΉκ΅ν΄μ μλμ μ΄μ§ μμ μλμ΄ μΌμ΄λκΈ° λλ¬Έμ΄λ€.
Integer num1 = new Integer(100);
Integer num2 = new Integer(100);
num1 == num2; // μ°Έμ‘°νκ³Ό μ°Έμ‘°ν λΉκ΅ false
λ°λΌμ λνΌ ν΄λμ€μ κ°μ²΄ κ° λΉκ΅λ ν¬μ₯ λ΄λΆμ κ°μ μ»μ΄ λΉκ΅ν΄μΌ λκΈ° λλ¬Έμ, μ§μ μΈλ°μ±ν΄μ λΉκ΅νλκ°, equals() λ©μλλ₯Ό ν΅ν΄ λ°λ‘ λΉκ΅κ° κ°λ₯νλ€.
Integer num1 = new Integer(10);
Integer num2 = new Integer(20);
Integer num3 = new Integer(10);
System.out.println(num1 == num3); // false
System.out.println(num1.equals(num3)); // true
// λλ± λΉκ΅ μΈμ μ°μ°μ λ¬Έμ μλ€.
System.out.println(num1 < num2); // true
System.out.println(num1 + num2); // 30
λμ λνΌ ν΄λμ€μ κΈ°λ³Έ μλ£νκ³Όμ λΉκ΅λ μλμΌλ‘ μ€ν λ°μ±κ³Ό μΈλ°μ±μ ν΄μ£ΌκΈ° λλ¬Έμ == μ°μ°κ³Ό equals μ°μ° λͺ¨λ κ°λ₯νλ€.
Integer num = new Integer(10); // λνΌ ν΄λμ€1
Integer num2 = new Integer(10); // λνΌ ν΄λμ€2
int i = 10; // κΈ°λ³Ένμ
// λνΌν΄λμ€ == κΈ°λ³Ένμ
System.out.println(num == i); // true
// λνΌν΄λμ€.equals(κΈ°λ³Ένμ
)
System.out.println(num.equals(i)); // true
// λνΌν΄λμ€ == λνΌν΄λμ€
System.out.println(num == num2); // false (invalid)
// λνΌν΄λμ€.equals(λνΌν΄λμ€)
System.out.println(num.equals(num2)); // true
μλ£ν λ³ν λ©μλ
κ°μ²΄λ₯Ό ν¬μ₯νλ κΈ°λ₯ μΈμλ, λνΌ ν΄λμ€λ μ체 μ§μνλ parseνμ
() λ©μλλ₯Ό μ΄μ©νμ¬ λ°μ΄ν° νμ
μ ν λ³ν ν λλ μ μ©ν μ°μΈλ€.
String str = "10";
String str2 = "10.5";
String str3 = "true";
byte b = Byte.parseByte(str);
int i = Integer.parseInt(str);
short s = Short.parseShort(str);
long l = Long.parseLong(str);
float f = Float.parseFloat(str2);
double d = Double.parseDouble(str2);
boolean bool = Boolean.parseBoolean(str3);
System.out.println("λ¬Έμμ΄ byteκ° λ³ν : "+b);
System.out.println("λ¬Έμμ΄ intκ° λ³ν : "+i);
System.out.println("λ¬Έμμ΄ shortκ° λ³ν : "+s);
System.out.println("λ¬Έμμ΄ longκ° λ³ν : "+l);
System.out.println("λ¬Έμμ΄ floatκ° λ³ν : "+f);
System.out.println("λ¬Έμμ΄ doubleκ° λ³ν : "+d);
System.out.println("λ¬Έμμ΄ booleanκ° λ³ν : "+bool);
Boxing & Unboxing μ±λ₯ κ³ λ €
κΈ°λ₯μ νΈμμ±μ μνμ¬ μ€ν λ°μ± / μΈλ°μ±μ μ 곡νμ§λ§, λ€λ₯Έ νμ κ°μ ν λ³νμ μ΄ν리μΌμ΄μ μ μ±λ₯μ μν₯μ λ―ΈμΉκ² λλ€. λΉλ‘ μ¬μν μ°¨μ΄ μΌμ§λΌλ μ΄ν리μΌμ΄μ μ μ±λ₯ μΈ‘λ©΄μμ λ΄€μλ λ°λμ νμν μν©μ΄ μλλΌλ©΄ μ§μ ν΄μΌ νλ κ²μ΄ μ³λ€.
μ΄ν΄λ₯Ό λκΈ°μν΄ 100λ§ κ±΄μ λ°μ΄ν°λ₯Ό λ€λ£¨λ μμ λ₯Ό λ€μ΄λ³΄κ² λ€.
Auto Boxingμ ν¬ν¨ν μ°μ°
public static void main(String[] args) {
long t = System.currentTimeMillis(); // νμ¬ μκ°(λ°λ¦¬μ΄)λ₯Ό μ μ₯
Long sum = 0L; // λνΌ κ°μ²΄λ‘ μ€ν λ°μ±μΌλ‘ μ μ κ°μ μ μ₯
// λ°±λ§λ² λλ λμ λνκΈ° μ°μ°
for (long i = 0; i < 1000000; i++) {
sum += i;
}
System.out.println("processing time: " + (System.currentTimeMillis() - t) + " ms") ;
}
processing time: 34 ms
primitive νμ κ° μ°μ°
public static void main(String[] args) {
long t = System.currentTimeMillis();
long sum = 0L; // κΈ°λ³Έν μ μ νμ
μΈ long μλ£νμ μ μ μ μ₯
for (long i = 0; i < 1000000; i++) {
sum += i;
}
System.out.println("processing time: " + (System.currentTimeMillis() - t) + " ms") ;
}
processing time: 5 ms
μμ κ°μ΄ μ΄ 100λ§λ²μ sum μ°μ°μ ν΅ν΄ λ μ½λμ κ²°κ³Όλ₯Ό λΉκ΅ν΄ 보면, κ±°μ 5λ°°μ κ²°κ³Ό μ°¨μ΄λ₯Ό 보μ¬μ€λ€.
λ§μΌ μ€μ λ‘ λμ©λ νΈλν½μ΄ λ°μνλ μλΉμ€λ₯Ό μ΄μ©ν κ²½μ° 100λ§κ±΄μ λμ΄ 1000λ§κ±΄, 1μ΅κ±΄μ μ²λ¦¬κ° νμν μ§λ λͺ¨λ₯΄κ³ , λ¨μ§ λκ°μ μλ£κ°μ μ μ₯νμ§λ§ μ΄λ€ νμ λ°©μμΌλ‘ μ μΈνλλμ λ°λΌ μ΄ν리μΌμ΄μ μ±λ₯ μ°¨μ΄λ μ μ λ²μ΄μ§κ² λ κ²μ΄λ€.
λ°λΌμ μμ±ν μ½λμ λΆνμν auto castingμ΄ λ°λ³΅μ μΌλ‘ μ΄λ£¨μ΄μ§κ³ μλμ§ νμΈνλ κ²μ λμ©λ μλΉμ€λ₯Ό κ°λ°νλλ° μμ΄μ κΌΌκΌΌν νμ ν΄μΌνλ μμμ΄λ€.
# μ°Έκ³ μλ£
http://www.tcpschool.com/java/java_api_wrapper