ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java - Wrapper Class
    Language/Java 2022. 9. 20. 15:17

    래퍼 클래스(Wrapper Class)

    래퍼 클래스(Wrapper Class)란?

    자바의 자료형은 크게 기본 타입(Primitive Type)과 참조 타입(Reference Type)으로 나뉜다. 

    기본 타입은 대표적으로 char, int, float, double, boolean 등이 있고 참조 타입은 class, interface 등이 있는데, 프로그래밍을 하다 보면 기본 타입의 데이터를 객체로 표현해야 하는 경우가 있다. 이러한 상황에서 기본 타입을 객체로 다루기 위해서 사용하는 클래스들을 래퍼 클래스(Wrapper Class)라고 한다.

    자바의 모든 기본 타입은 값을 갖는 객체를 생성할 수 있다. 이러한 객체를 포장 객체라고도 하는데 그 이유는 기본 타입의 값을 내부에 두고 포장하기 때문이다. 래퍼 클래스로 감싸고 있는 기본 타입의 값은 외부에서 변경하지 못하며, 만약 값을 변경하고 싶다면 새로운 포장 객체를 만들어야 한다.

     

    래퍼 클래스의 종류

     

    기본 타입(Primitive Type) 래퍼 클래스(Wrapper Class)
    byte Byte
    char Character
    int Integer
    float Float
    double Double
    boolean Boolean
    long Long
    short Short

    래퍼 클래스는 java.lang 패키지에 포함되어 있다. 위 표와 같이 기본 타입에 대응하는 래퍼 클래스들이 있다.

     

    래퍼 클래스 구조도

    위 사진에서 알 수 있듯이 모든 래퍼 클래스의 부모는 Object이고, 내부적으로 숫자를 다루는 래퍼 클래스의 부모 클래스는 Number이다.


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

    박싱(Boxing)과 언박싱(UnBoxing)이란?

     

    기본 타입의 값을 포장 객체로 만드는 과정을 박싱이라고 하고, 반대로 포장 객체에서 기본 타입의 값을 얻어내는 과정을 언박싱이라고 한다.

     

    public class Wrapper {
        public static void main(String[] args) {
            Integer number = new Integer(10);   // 박싱
            int n = number.intValue();   // 언박싱
        }
    }

     

    자동 박싱(AutoBoxing과 자동 언박싱(AutoUnBoxing)
    public class Wrapper {
        public static void main(String[] args) {
            Integer number = 10;   // 자동 박싱
            int n = number;   // 자동 언박싱
        }
    }

    기본 타입의 값을 직접 박싱, 언박싱하지 않아도 자동적으로 박싱과 언박싱이 일어나는 경우가 있다. 

    위 코드와 같이 포장 클래스 타입에 기본값이 대입될 경우 발생한다. 위의 코드의 경우 int 타입의 값 10을 Integer 클래스 변수 number에 대입하면 자동 박싱이 일어나 Heap 영역에 Integer 객체가 생성된다.


    래퍼 클래스의 사용 예제

    문자열의 기본 타입 변환
    public class Wrapper {
        public static void main(String[] args) {
            String str01 = "10";
            String str02 = "10.5";
            String str03 = "true";
            
            byte b = Byte.parseByte(str01);
            int i = Integer.parseInt(str01);
            short s = Short.parseShort(str01);
            long l = Long.parseLong(str01);
            float f = Float.parseFloat(str02);
            double d = Double.ParseDouble(str02);
            boolean bool = Boolean.parseBoolean(str03);
            
            System.out.println("문자열 byte값 변환 : " + b);   // "문자열 byte값 변환 : 10"
            System.out.println("문자열 int값 변환 : " + i);   // "문자열 int값 변환 : 10"
            System.out.println("문자열 short값 변환 : " + s);   // "문자열 short값 변환 : 10"
            System.out.println("문자열 long값 변환 : " + l);   // "문자열 long값 변환 : 10"
            System.out.println("문자열 float값 변환 : " + f);   // "문자열 float값 변환 : 10.5"
            System.out.println("문자열 double값 변환 : " + d);   // "문자열 double값 변환 : 10.5"
            System.out.println("문자열 boolean값 변환 : " + bool);   // "문자열 boolean값 변환 : true"
        }
    }

    래퍼 클래스의 주용도는 리본 타입의 값을 박싱 해서 포장 객체로 만드는 것이지만, 문자열을 기본 타입 값으로 변환할 때에도 사용된다.

    대부분의 래퍼 클래스에는 parse + 기본 타입명으로 되어있는 정적 메서드가 존재하며, 이 메서드를 사용해서 문자열을 매개 변수로 받아 기본 타입 값으로 변환하는 데 사용이 된다.

     

    값 비교
    public class Main {
        public static void main(String[] args) {
            Integer number01 = new Integer(10);
            Integer number02 = new Integer(10);
            int i = 10;
            
            System.out.println("래퍼클래스 == 기본타입 : " + (number01 == i));   // true
            System.out.println("래퍼클래스.equals(기본타입) : " + number01.equals(i));   // true
            System.out.println("래퍼클래스 == 래퍼클래스 : " + (number01 == number02));   // false
            System.out.println("래퍼클래스.equals(래퍼클래스) : " + number01.equals(number02)));   // true
        }
    }

    래퍼 객체는 내부의 값을 비교하기 위해 '==' 연산자를 사용할 수 없다. '==' 연산자는 내부의 값을 비교하는 것이 아니라 래퍼 객체의 참조 주소를 비교하기 때문이다.

    비교 대상인 래퍼는 객체이기 때문에 서로의 참조 주소가 다르다. 객체끼리의 비교를 하려면 내부의 값만 얻어 비교해야 하기에 'equals()'를 사용해야 한다.

    래퍼 클래스와 기본 타입과의 비교는 '==' 연산과 'equals()' 사용이 모두 가능하다. 그 이유는 컴파일러가 오토 박싱, 오토 언박싱을 해주기 때문이다.


    출처

    https://coding-factory.tistory.com/547

     

    728x90

    'Language > Java' 카테고리의 다른 글

    Java - final  (0) 2022.09.20
    Java - '==' 연산자 와 'equals()'를 이용한 문자열 비교  (0) 2022.09.20
    Java - Mutex & Semaphore & Monitor  (0) 2022.04.06
    Java - Reflection  (0) 2022.04.05
    Java - hashCode() & equals()  (0) 2022.04.05

    댓글

Designed by Tistory.