JAVA : Wrapper

keymu·2024년 9월 26일
0

Wrapper 클래스:

  • 기본 자료형의 데이터를 감싸는 클래스
  • Wrapper 클래스는 String처럼 Immutable(불변)이다.
  • Wrapper는 null값을 가질 수 있다. (primitive는 표현할 수 없는 값)
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);
  • Wrapper 끼리의 ==, != 연산은 '주소'를 비교한다.
  • Wrapper가 가지고 있는 값을 비교하려면 equals를 사용해야 한다.

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

profile
Junior Backend Developer

0개의 댓글