Wrapper 클래스:
Integer i1 = 100; //reference에 Prmitive값이 들어가는 상황
i1 = i1 + 20;//reference가 산술연산 하는 상황
어떻게 가능할까?
Wrapper 클래스는 마치 primitive 타입처럼 동작한다.
1. Wrapper 클래스의 static method인 valueOf() 메소드를 사용
Integer num1 = Integer.valueOf(123);
System.out.println("num1 = " + num1);
Integer num2 = Integer.valueOf(123);
System.out.println("num2 = " + num2);
System.out.println(num1==num2);
valueOf() 는 Object를 cache 해둔다. 같은 literal로 생성하면 같은 Object.
메모리 절약 차원.
도움말 확인 : If a new Integer instance is not required, this method should generally be used in preference to the constructor
2. literal 상수로 생성
Integer num2 = Integer.valueOf(123);
Integer num5 = 123;
System.out.println(num2 == num5);
123 Literal(상수) 를 가지고 Integer 클래스의 인스턴스를 생성
Integer.valueOf(123) 과 동일한 코드가 동작됨 (Auto - Boxing)
3. valueOf(문자열) 사용
Integer num6 = Integer.valueOf("123");
Integer num5 = 123;
System.out.println(num6 == num5); //true
4. 산술 연산 가능
Integer num5 = 123;
Integer num6 = Integer.valueOf("123");
num6 *= 2;
System.out.println(num6 == num5); //false
5. Wrapper는 null 값을 가질 수 있다
Integer num3 = null;
System.out.println(null+10); //NPE
Auto-boxing / Auto-unboxing
//Example:
Integer num1 = 10; // Integer.valueOf(10); << auto-boxing 동작
Integer num2 = 20;
Integer num3 = num1 + num2; // num1.intValue() << auto-unboxing
Integer num30 = Integer.valueOf(num1.intValue() + num2.intValue());
System.out.println(num3);
System.out.println(num30);
Integer num5 = 200; //auto-boxing
System.out.println("num5 = " + num5); //auto-unboxing
int n5 = num5; //auto-unboxing
Long num300 = 300L; //auto-boxing
Double num400 = 1.2345; //auto-boxing
System.out.println(num1.intValue());
System.out.println(num1.doubleValue()); //10.0: type 변경 후 unboxing 가능
주의
Integer num1 = 10;
Integer num2 = 10;
System.out.println(num1==num2); //unboxing 없이 주소 비교: false
System.out.println(num1==10); //unboxing 함: true