JAVA

[JAVA] Wrapper 클래스

shb 2022. 2. 17. 14:02

 Wrapper 클래스: 기본 자료형(primitive type)의 데이터를 감싸는 클래스
 * 기본 자료형: boolean, char, byte, short, int, long, float, double
 * Wrapper: Boolean, Character, Byte, Short, Integer, Long, Float, Double
 
 * Wrapper 클래스는 String 과 마찬가지로 immutable(불변) 이다. 

 

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
		System.out.println("num1 = " + num1);
		
		
		// 2. wrapper 클래스의 static 메소드인 valueOf() 메소드를 사용
		Integer num2 = Integer.valueOf(123);
		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");
				
		
		
		// 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 클래스에 저장된 기본자료형 값을 꺼내는 것

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());
		
		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 = 10000000000L;
		
		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

BigInteger, BigDecimal

 * BigInteger
   정수타입 기본자료형으로 담을 수 없는 한계 범위 밖의 값들을 다룰 때 사용하는 객체

 * BigDecimal
   실수타입 기본자료형에서 발생하는 정밀도의 문제는 극복하기 위해 사용하는 객체   
 * 이들은 반드시, 인스턴스를 생성해서 사용해야 한다.

 

public class Wrapper04Main {

	public static void main(String[] args) {
		System.out.println("[1] BigInter 클래스");
		System.out.println("Integer 최소값: " + Integer.MIN_VALUE);
		System.out.println("Integer 최대값: " + Integer.MAX_VALUE);
		System.out.println("Long 최소값: " + Long.MIN_VALUE);
		System.out.println("Long 최대값: " + Long.MAX_VALUE);
		
		//long num = 10000000000000000000L;
		// 컴파일 에러: long 타입의 최대값이 넘는 수는 사용할 수 없다.
		// 사용할 수 있는 정수의 한계를 없앤 클래스가 BigInteger
		
		// 1. 큰 수(BigInteger) 인스턴스 생성
		// long의 크기를 넘어가는 숫자를 표기할 수 없기 때문에
		// 생성자에 매개변수로 스트링을 넘겨준다.

		// TODO
		
		
		// 2. 사칙연산과 같은 계산을 위해서는 메소드를 사용

		// TODO
		
		System.out.println();
		System.out.println("[2] BigDecimal 클래스");

		// TODO
		
		
		// float, double 등은 오차가 발생하는 것을 피할 수 없다.
		// 오차를 없애기 위해서 만들어지 클래스가 BigDecimal
		
		// 1. BigDecimal 클래스의 인스턴스 생성

		// TODO
		
		// 2. 계산은 메소드를 사용

		// TODO
		
		System.out.println("\n프로그램 종료");
	} // end main()

} // end class

* Wrapper 클래스의 유용성
  1. Object 타입이 모~든 (심지어 primitive) 타입도 받을수 있다.
  2. Collection 과 같은 Generic 클래스에선 primitive 타입을 담을수 없다. 그러나 ,Wrapper 를 통해 가능하다.
  3. Wrapper 는 null 값 표현 가능

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

'JAVA' 카테고리의 다른 글

[JAVA] 내부 클래스  (0) 2022.02.17
[JAVA] Collection  (0) 2022.02.17
[JAVA] 문자열 메소드  (0) 2022.02.17
[JAVA] 정규표현식  (0) 2022.02.17
[JAVA] 예외처리  (0) 2022.02.16