언어(Language)/Java

[Java] 자바 래퍼 클래스(Wrapper Class) 개념 정리 및 활용

잇트루 2022. 9. 20. 02:00
반응형

래퍼 클래스(Wrapper Class)

래퍼 클래스는 기본 타입의 데이터를 객체로 취급하여 사용(참조 변수를 사용) 하기 위해 사용한다.

예를 들어, 제네릭 같은 기본형 데이터 타입의 사용을 하지 못하나, 기본 타입의 데이터를 사용해야만 할 경우에 사용된다.

실제로, Integer와 Double와 같은 클래스는 내부에서 기본 데이터 타입을 감싸는 형태로 구현되어 있다.

public final class Integer extends Number implements Comparable<Integer> {
    ...
    @Native public static final int   MIN_VALUE = 0x80000000;
    @Native public static final int   MAX_VALUE = 0x7fffffff;
    ...
}

 

래퍼 클래스의 종류

래퍼 클래스는 기본형 데이터 타입을 참조 변수 형태로 사용하기 위해 구현된 클래스로, 8개의 기본 타입에 대하여 모든 래퍼 클래스를 제공하고 있다.

Boolean

boolean 타입의 래퍼 클래스이다.

Boolean b = new Boolean(true);
Boolean b = new Boolean("true");

 

Character

char 타입의 래퍼 클래스이다.

Character ch = new Character('A');

 

Byte

byte 타입의 래퍼 클래스이다.

Byte num = new Byte(10);
Byte num = new Byte("10");

 

Short

short 타입의 래퍼 클래스이다.

Short num = new Short(10);
Short num = new Short("10");

 

Integer

int 타입의 래퍼 클래스이다.

Integer num = new Integer(10);
Integer num = new Integer("10");

 

Long

long 타입의 래퍼 클래스이다.

Long num = new Long(10);
Long num = new Long("10");

 

Float

float 타입의 래퍼 클래스이다.

Float pi = new Float(3.14f);
Float pi = new Float("3.14f");

 

Double

double 타입의 래퍼 클래스이다.

Double pi = new Double(3.14);
Double pi = new Double("3.14");

즉, 모든 기본 데이터 타입에 대하여 대응하여 래퍼 클래스가 존재한다.

 

래퍼 클래스는 기본 타입의 첫 글자를 대문자로 바꾸는 것으로 사용이 가능하다.

하지만, int형과 char형의 경우 Integer와 Character로 사용해야 하므로 주의해야 한다.

또한, 래퍼 클래스는 Object 클래스와 Number 클래스로부터 상속을 받기 때문에 주소 값을 가진다.

따라서 객체를 생성할 때, 문자열 형태로 큰따옴표“”를 사용하여 생성할 수 있다. 단, Character 타입은 제외한다.

 

래퍼 클래스의 비교

public class WrapperClassEx {
    public static void main(String[] args) {
        Integer num1 = new Integer(100);
        Integer num2 = new Integer(100);

        System.out.println(num1 == num2); // false
        System.out.println(num1.equals(num2)); // true
        System.out.println(num1.compareTo(num2)); // 0

        System.out.println(num1.MAX_VALUE); // 2147483647
        System.out.println(num1.MIN_VALUE); // -2147483648
        System.out.println(num1.SIZE);      // 32
        System.out.println(num1.BYTES);     // 4
    }
}

래퍼 클래스는 등가 비교 연산자(==)를 사용하여 비교할 경우 false를 반환한다.

num1과 num2가 참조하는 주소 값이 다르기 때문이다.

compareTo() 메서드를 사용할 경우 값을 비교하기 때문에 같은 값으로 판단하여 0을 반환한다.

compareTo() 메서드는 num1에 위치한 값이 크면 양수, 작으면 음수를 반환한다.

 

또한, 기본 타입인 int형과 같은 범위와 크기를 가지며, 다른 래퍼 클래스도 대응되는 기본형과 같은 결과를 나타낸다.

 

박싱(Boxing)과 언박싱(UnBoxing)

래퍼 클래스는 산술 연산을 위해 정의된 클래스가 아니다. 즉, 인스턴스에 저장된 값을 변경할 수는 없다.

하지만, 래퍼 클래스를 기본 타입의 데이터로 바꾸는 것을 언박싱이라 하고, 기본 타입 객체를 래퍼 클래스의 인스턴스로 변환하는 박싱이 있다.

public class WrapperClassEx {
    int num = 100;

    // 박싱
    Integer integerNum = (Integer)num;
    System.out.println(integerNum);

    // 언박싱
    int sum = (int)integerNum + 100;
    System.out.println(sum);
}

상황에 따라 자바 컴파일러가 이를 자동으로 처리해준다. 자동으로 변환된 것을 오토 박싱과 오토 언박싱이라 한다.

오토 박싱

Boolean b = true;
Character ch = 'A';
Byte num = 10;
Short num = 10;
Integer num = 10;
Long num = 10;
Float pi = 3.14f;
Double pi = 3.14;

위와 같이 래퍼 클래스를 선언할 경우 자바 컴파일러에서는 자동적으로 박싱을 해주어 산술 연산이 가능한 상태로 변환한다.

따라서 객체로 생성했을 때와는 달리, 오토 박싱 상태에서 등가 비교 연산(==)을 하여 비교할 경우 기본 타입과 같은 결과를 나타낸다.

public class WrapperClassEx {
    public static void main(String[] args) {
        Integer num1 = 100;
        Integer num2 = 100;

        System.out.println(num1 == num2); // true
        System.out.println(num1.equals(num2)); // true
        System.out.println(num1.compareTo(num2)); // 0
    }
}

 

오토 언박싱

언박싱의 반대되는 상황으로 기본 타입의 데이터를 래퍼 클래스의 인스턴스로 변환하는 것이다.

public class WrapperClassEx {
    public static void main(String[] args) {
        Integer integerNum = 100;
        int num = integerNum + 100;

        System.out.println(num); // 200
    }
}
반응형