Wrapper 클래스 : 기본 자료형(primitive type)의 데이터를 감싸는 클래스
- 기본 자료형: boolean, char, byte, short, int, long, float, double
- Wrapper: Boolean, Character, Byte, Short, Integer, Long, Float, Double
- Wrapper 클래스는 String 과 마찬가지로 immutable(불변) 이다.
package com.lec.java.wrapper01;
public class Wrapper01Main {
public static void main(String[] args) {
System.out.println("Wrapper 클래스");
System.out.println("wrapper 클래스에 값을 저장하는 방법");
System.out.println();
Integer i1 = 100; // reference <= primitive ???
i1 = i1 + 200; // reference가 산술연산??!
System.out.println("i1 = " + i1);
// Wrapper 클래스는 마치 primitive 타입처럼 동작한다!
// 1. 생성자 이용
Integer num1 = new Integer(123); // Java9 부터 deprecated (지금 당장 error는 아니지만, java 버전업 시 추후 없어지거나 사라질 수 있다는 의미)
System.out.println("num1 = " + num1);
// 2. wrapper 클래스의 static 메소드인 valueOf() 메소드를 사용
Integer num2 = Integer.valueOf(123); // 내부적으로 new로 생성
System.out.println("num2 = " + num2);
System.out.println((num1 == num2) ? "같은참조" : "다른참조");
System.out.println(num1.equals(num2) ? "같은값" : "다른값"); // 같은 값
// 3. new Integer() VS Integer.valueOf()
Integer num3 = new Integer(123);
Integer num4 = Integer.valueOf(123); // valueOf() 는 Object를 cache 해둔다. 같은 literal로 생성하면 같은 Object. 기존 레퍼런스를 리턴함.
// 메모리 절약 차원/
System.out.println();
// num1 == num3 ??
System.out.println((num1 == num3) ? "같은참조" : "다른참조");
// num2 == num4 ??
System.out.println((num2 == num4) ? "같은참조" : "다른참조");
// 4. literal 상수로 생성
System.out.println();
Integer num5 = 123; // 내부적으로 Integer.valueOf(123)와 동일한 코드 동작됨
System.out.println((num5 == num4) ? "같은참조" : "다른참조");
// 5. valueOf(문자열) 가능!
System.out.println();
Integer num6 = Integer.valueOf("123"); // num4, num5, num6 동일
// 6. 산술 연산 가능
num6 *= 2;
System.out.println(num6);
System.out.println("\n프로그램 종료");
} // end main()
} // end class
Java 5부터 wrapper 클래스의 auto-boxing/unboxing 기능 제공
- boxing(포장): 기본자료형의 값을 wrapper 클래스에 저장하는 것
- unboxing(개봉): wrapper 클래스에 저장된 기본자료형 값을 꺼내는 것
package com.lec.java.wrapper02;
/* Java 5부터 wrapper 클래스의 auto-boxing/unboxing 기능 제공
* boxing(포장): 기본자료형의 값을 wrapper 클래스에 저장하는 것
* unboxing(개봉): wrapper 클래스에 저장된 기본자료형 값을 꺼내는 것
*/
public class Wrapper02Main {
public static void main(String[] args) {
System.out.println("auto-boxing, auto-unboxing");
Integer num1 = 10; // Integer.valueOf(10); // auto-boxing
Integer num2 = 20;
Integer num3 = num1 + num2;
Integer num30 = Integer.valueOf(num1.intValue() + num2.intValue()); // 2번의 unboxing + 1번의 boxing
System.out.println("num3 = " + num3);
System.out.println();
System.out.println("boxing/unboxing");
// boxing(포장): 기본자료형의 값을 wrapper 클래스에 저장하는 것
// unboxing(개봉): wrapper 클래스에 저장된 기본자료형 값을 꺼내는 것
Integer num4 = Integer.valueOf(100); // boxing
int n4 = num4.intValue(); // unboxing
System.out.println();
System.out.println("auto-boxing/auto-unboxing");
// TODO
System.out.println();
System.out.println("wrapper 클래스들");
Long num100 = Long.valueOf(1000000000L); // Boxing
num100 = 1000000000L;
Double num200 = 3.14; // boxing
double d200 = num200; // unboxing num200.doubleValue()
// 주의!
// Wrapper 클래스는 == 와 같은 비교연산시 한쪽이 primitive type 이면 auto-unboxing 하여 비교 하나
// 비교연산자의 양쪽이 wrapper 인 경우는 주소값으로 비교한다.
// wrapper 끼리의 값 비교할때는 .equals() 를 사용하자.
Integer num5 = 100;
System.out.println(num5 == 100); // int값 비교, unboxing
Integer num6 = 100;
System.out.println(num5 == num6); // 주소 비교, unboxing 없다.
System.out.println("\n프로그램 종료");
} // end main()
} // end class
- Object 타입이 모~든 (심지어 primitive) 타입도 받을수 있다.
- Collection 과 같은 Generic 클래스에선 primitive 타입을 담을수 없다. 그러나 ,Wrapper 를 통해 가능하다.
- Wrapper 는 null 값 표현 가능
package com.lec.java.wrapper05;
public class Wrapper05Main {
public static void main(String[] args) {
System.out.println("Wrapper 클래스의 유용성");
Object obj1 = 100;
// ↑ Auto-Boxing + Polymorphism (다형성)
System.out.println(obj1);
System.out.println((Integer)obj1 * 3);
// int n = null; // X
Integer n = null; // OK
System.out.println("\n프로그램 종료");
} // end main()
// TODO
} // end class
// TODO