개발/Java

Primitive Wrapper Class

하프킴 2021. 5. 17. 00:18
728x90

Wrapper Class의 종류

자바는 모든 기본 타입은 값을 갖는 객체를 생성할 수 있음

래퍼 클래스로 감싸고 있는 기본 타입 값은 외부에서 변경할 수 없다.

만약 값을 변경하고 싶다면 새로운 포장 객체를 만들어야 한다.

Wrapper 클래스 구조도

 

 

자바에서 Primitive 타입을 객체화 하기 위한 rapper 클래스가 있다.

 

객체로 만들어 null을 넣거나, 메소드를 사용할 수 있고, toString() 메소드를 사용해 String 타입으로 바로 변환할 수 있음.

List등의 컬렉션에 참조형 타입의 객체를 넣기 위해서 Wrapper 클래스로 한번 감싼것.

 

Autoboxing : Primitive를 Wrapper Class의 인스턴스로 변환

Autounboxing : 그 반대의 과정

Integer num = 17; // 자동 박싱
int n = num; //자동 언박싱

 

 

아래의 코드를 실행하면

Integer num = new Integer(10); //래퍼 클래스1
        Integer num2 = new Integer(10); //래퍼 클래스2
        int i = 10; //기본타입
		 
        System.out.println("래퍼클래스 == 기본타입 : "+(num == i)); //true
        System.out.println("래퍼클래스.equals(기본타입) : "+num.equals(i)); //true
        System.out.println("래퍼클래스 == 래퍼클래스 : "+(num == num2)); //false
        System.out.println("래퍼클래스.equals(래퍼클래스) : "+num.equals(num2)); //true
    }
}

 

결과는 아래와 같다.

래퍼의 객체는 내부의 값을 비교하기 위해 == 연산자를 사용할 수 없다.

왜냐하면 객체의 주소값을 비교하는 것이기 때문이다.

그래서 값을 꺼내서 비교해주는 equals를 통해서 비교해야 한다.

 

Byte의 equals는 아래와 같이 구현되어 있다.

    /**
     * Compares this object to the specified object.  The result is
     * {@code true} if and only if the argument is not
     * {@code null} and is a {@code Byte} object that
     * contains the same {@code byte} value as this object.
     *
     * @param obj       the object to compare with
     * @return          {@code true} if the objects are the same;
     *                  {@code false} otherwise.
     */
    public boolean equals(Object obj) {
        if (obj instanceof Byte) {
            return value == ((Byte)obj).byteValue();
        }
        return false;
    }

 

래퍼클래스와 기본 자료형의 비교는 ==, equals 연산 모두 가능하다.

왜냐하면 컴파일러가 자동으로 오토언방식을 해주기 때문이다.

 

valueOf

parse

 

 

WrapperCache

 

 

Wrapper 클래스 안에 Inner Class가 존재함.

 

    private static class ByteCache {
        private ByteCache(){}

        static final Byte cache[] = new Byte[-(-128) + 127 + 1];

        static {
            for(int i = 0; i < cache.length; i++)
                cache[i] = new Byte((byte)(i - 128));
        }
    }

 

오토박싱을 도와주는 캐시를 가지는 것을 알 수 있다.

기본값은 -128 ~ 127 사이의 값을 가지는 인스턴스를 미리 생성하고 있음.