자바의 데이터 타입
1) 프리미티브 타입 : 수치, 문자, 논리값
2) 레퍼런스 타입 : 프리미티브 외의 다른 타입

Wrapper 클래스는 프리미티브 타입의 데이터를 객체로 만들 때 사용.
프리미티브 타입의 값을 감싸는(warp) 역할을 함.

프리미티브 타입을 표현하는 JDK 라이브러리 클래스 (Wrapper 클래스)
Byte, Short, Integer, Long, Character, Float, Double, Boolean


1. Wrapper 클래스의 사용 방법

하나의 래퍼 객체에는 하나의 프리미티브 값을 담을 수 있으며, 그 값은 생성자 파라미터로 넘겨줘야 한다.
이렇게 파라미터로 넘겨진 프리미티브 타입의 값은 래퍼 객체 안에 저장되며, 이는 래퍼 클래스의 메소드 Value를 붙여 가져올 수 있다.

obj1 = new Byte((byte) 1); // Wrapper 클래스의 생성자
byte num1 = obj1.byteValue(); // Wrapper 객체 안에 있는 프리미티브 타입의 값을 가져오는 Value 메소드

obj2 = new Short((short) 123);
short num2 = obj2.shortValue();

obj3 = new Integer(12345);   
int num3 = obj3.intValue();
int num3 = Interger.parseInt(""); // int형으로 변환

long obj4 = new Long(123457890L);
long num4 = obj4.longValue();

float obj5 = new Float(1.5f);
float num5 = obj5.floatValue();

obj6 = new Double(1.0005);
double num6 = obj6.doubleValue();
double num6 = Double.parseDouble(); // double형으로 변환

obj7 = new Character('꽃');
char ch = obj7.charValue();

obj8 = new Boolean(true);
boolean truth = obj8.booleanValue();


예제) Wrapper 클래스의 사용 예
package Wrapper_Class;
public class WrapperExample1 {
public static void main(String args[]){
Integer obj1 = new Integer(12); // Integer 객체를 생성
Integer obj2 = new Integer(7);
int sum = obj1.intValue() + obj2.intValue(); // Integer 객체 안의 int 값을 가져옴.
System.out.println(sum);
}
}
결과) 19


2. 문자열 파라미터를 받는 Wrapper 클래스의 생성자

파라미터로 받은 문자열을 해석하여 프리미티브 타입의 값으로 만든 후에 래퍼 객체 안에 저장.

obj1 = new Byte("1");
byte num1 = obj1.ByteValue();

obj2 = new Short("123");
short num2 = obj2.shortValue();

obj3 = new Integer("12345");   
int num3 = obj3.intValue();
int num3 = Interger.parseInt(""); // 문자열을 int형으로 변환

obj4 = new Long("123457890L");
long num4 = obj4.longValue();

obj5 = new Float("1.5f");
float num5 = obj5.floatValue();

obj6 = new Double("1.0005");
double num6 = obj6.doubleValue();

obj8 = new Boolean("true");
boolean truth = obj8.booleanValue();

※ Character 클래스에는 문자열 파라미터를 받는 생성자가 없다.



예제) 래퍼 클래스의 문자열 파라미터를 받는 생성자의 사용 예
package Wrapper_Class;
class WrapperExample2 {                              
    public static void main(String args[]) {         
        int total = 0;                               
        for (int cnt = 0; cnt < args.length; cnt++) {
            Integer obj = new Integer(args[cnt]); // 명령형 파라미터로 받은 문자열로 Integer 객체를 생성
            total += obj.intValue();   // Integer 객체 안에 있는 int 값을 가져옴
        }                                            
        System.out.println(total);                   
    }                                                
}                                                   


문제) 래퍼 클래스 관련 예외처리
래퍼 클래스의 생성자는 잘못된 문자열을 파라미터로 받으면 NumberFormatException을 발생시킨다.
위의 예제로 익셉션 처리를 하도록 수정하라.

class WrapperExample2 {                              
    public static void main(String args[]) {
    try {
        int total = 0;                               
        for (int cnt = 0; cnt < args.length; cnt++) {
            Integer obj = new Integer(args[cnt]);    
            total += obj.intValue();                 
        }                                            
        System.out.println(total);  
    }    
    catch (NumberFormatException e) {
    System.out.print("잘못된 숫자 포멧입니다.");
    }
    }                                                
}                                                   
  

3. Wrapper 클래스의 정적 메소드와 상수

래퍼 클래스에는 프리미티브 값을 저장하는 기본 기능 외에도 프리미티브 타입에 관한 여러가지 유용한 정적 메소드와 상수가 있다.

1) 파리미티브 타입의 비트 패턴을 가져오는 정적 메소드 toBinaryString, ToRawIntBits, ToRawLongBits

toBinaryStringInteger와 Long 클래스에 있는 메소드로, 파라미터로 넘겨준 int값과 Long 값의 내부 비트 패턴을 문자열로 만들어서 리턴하는 메소드.

String str1 = Integer.toBinaryString(9); // 비트 "1001"을 리턴
String str2 = Long.toBinaryString(100000000L); // 비트 "1011111010111110000100000000"을 리턴

ToRawIntBits, ToRawLongBits
Float, Double 클래스는 float, double 타입의 값을 그와 똑같은 비트 패턴을 갖는 int, long 타입의 값으로 만드는 메소드가 있다.

int num1 = Float.floatToRawIntBits(1.5f); // 1.5f와 똑같은 비트 패턴의 int 값을 리턴
long num2 = Double.doubleToRawLongBits(1.0005); // 1.0005와 똑같은 비트 패턴의 long 값을 리턴


2) 문자열을 프리미티브 타입으로 바꾸는 정적 메소드 parse...

byte num1 = Byte.parseByte("1");
short num2 = Short.parseShort("123");
int num3 = Interger.parseInt("12345"); // 문자열을 int형으로 변환
long num4 = Long.parseLong("123457890");
float num5 = Float.parseFloat("1.5");
double num6 = Double.parseDouble("1.0005");
boolean truth = Boolean.parseBoolean("true");


예제) Wrapper 클래스의 parse- 메소드 사용 예
class WrapperExample3 {
    public static void main(String args[]) {
        int total = 0;
        for (int cnt = 0; cnt < args.length; cnt++)
            total += Integer.parseInt(args[cnt]); // 명령형 파라미터로 받은 문자열을 int값으로 바꿔 합산
        System.out.println(total);
    }
}
결과) 19


3) Wrapper 클래스의 생성자를 대신하는 정적 메소드 valueOf
valueOf : 래퍼 클래스에서 생성자를 대신해서 사용할 수 있는 메소드. 래퍼 클래스의 생성자 파라미터에 해당하는 값을 넘겨주면 그에 해당하는 래퍼 객체가 리턴된다.

obj1 = Byte.valueOf((byte) 1); // Wrapper 클래스의 생성자를 대신하는 메소드 valueOf
obj2 = Short.valueOf((short) 123);
obj3 = Integer.valueOf(12345);   
obj4 = Long.valueOf(123457890L);
obj5 = Float.valueOf(1.5f);
obj6 = Double.valueOf(1.0005);
obj7 = Character.valueOf('꽃');
obj8 = Boolean.valueOf(true);

valueOf의 기능은 겉으로 보기엔 생성자와 똑같지만 똑같은 파라미터 값을 두번 이상 넘겨주면 전에 만들어둔 래퍼 객체를 리턴하기 때문에 생성자와는 다르다. 그렇기 때문에 래퍼 객체를 많이 필요로 하는 프로그램에서 이 메소드를 사용하면 객체 생성 시간과 메모리를 절약할 수 있어 효율적.


4) Wrapper 클래스에 선언되어 있는 상수
수치 타입에 해당하는 래퍼 클래스에는 해당 수치 타입으로 표현할 수 있는 최대값과 최소값이 상수로 선언되어 있다.
부동소수점 타입을 표현하는 래퍼 클래스에는 0/0의 결과와 무한대와 같은 특별한 의미의 상수들도 선언되어 있다.

public static final double NEGATIVE_INFINITY
public static final double NaN
public static final double MAX_VALUE
public static final double MIN_NORMAL
public static final double MIN_VALUE
public static final int MAX_EXPONENT



4. 자동 Boxing과 자동 Unboxing

프리미티브 값을 래퍼 객체로 만드는 것을 박싱(Boxing), 래퍼 객체를 프리미티브 값으로 만드는 것을 언박싱(Unboxing)이라고 한다. 박싱은 래퍼 클래스의 생성자를 이용해서 할 수 있고, 언방식은 Value 메소드를 이용하여 할 수 있다.

Integer obj = new Integer(12000); // 12000이란 프리미티브 값을 obj라는 객체로 생성 (Boxing)
int num = obj.intValue(); // obj라는 객체를 int 값으로 Unboxing


1) boxing : 프리미티브(primitive) 값을 객체로 만드는 것

printDouble(123.45);
void printDouble(Double obj) {
{

2) unboxing : 객체를 프리미티브 값으로 만드는 것

Integer obj = new Integer("10");
int sum = obj + 20;


※ 자바에서는 많은 경우 박싱과 언박싱이 자동으로 일어난다. (JDK 5.0부터 추가)

3) 래퍼 객체를 프리미티브 값으로 자동 언박싱 (Unboxing)
자바에서는 프리미티브 타입 값을 써야 할 자리에 래퍼 객체를 사용하면 래퍼 객체에서 프리미티브 값이 자동으로 추출되어 대신 사용된다.

예제) 자동 언박싱이 일어나는 예

class WrapperExample4 {
    public static void main(String args[]) {
        Integer obj = new Integer("10");
        int sum = obj + 20;    // Integer 객체와 int 값을 프리미티브 연산자 +도 더하고 있다.
        System.out.println(sum);
    }
}
결과) 30
Integer 객체와 int 값을 프리미티브 연산자로 더한다. 이 경우에는 Integer 객체로부터 ,int 값이 자동으로 추출된 후에 + 연산이 이루어진다.


4) 프리미티브 값을 래퍼 객체로 자동 박싱 (Boxing)
자바에서는 래퍼 객체가 쓰여야 할 자리에 프리미티브 타입의 값이 사용되면 그 값을 가지는 래퍼 객체가 자동으로 생성되어 대신 사용된다.

예제) 자동 박싱이 일어나는 예

class WrapperExample5 {
    public static void main(String args[]) {
        printDouble(new Double(123.45));
        printDouble(123.45);     // Double 타입의 값을 가지고
    }
    static void printDouble(Double obj) {  // Double 타입의 값을 호출
        System.out.println(obj);
    }
}
결과) 
123.45
123.45
이 프로그램에서는 double 타입의 값을 가지고 Double 타입 파라미터를 받는 메소드를 호출하고 있다. 이렇게 되면 메소드 호출 과정에서 double 타입의 값을 갖는 Double 객체가 자동으로 생성되어 메소드에 넘겨진다.





Posted by netyhobby
,