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 |