Wrapper 클래스

Agnes Park·2022년 3월 12일
0

JAVA

목록 보기
27/34
post-custom-banner

1. Wrapper 클래스

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

2. auto-boxing/unboxing

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

3. Wrapper 클래스의 유용성

  1. Object 타입이 모~든 (심지어 primitive) 타입도 받을수 있다.
  2. Collection 과 같은 Generic 클래스에선 primitive 타입을 담을수 없다. 그러나 ,Wrapper 를 통해 가능하다.
  3. 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
post-custom-banner

0개의 댓글