Java의 경우 기본형(Primitive types) 데이터를 직접 자료구조에 저장하지 못하는 경우, 기본형 데이터를 감싸주는 객체로 다뤄야하는 경우가 생긴다.
대표적으로 Java Collections(List, Set, Map 등)의 자료구조를 들 수 있으며, 해당 자료구조는 int, long, double 타입 등의 기본형 자료를 직접 다룰 수 없다.
이경우 직접 사용자가 기본형을 감싸주는 wrapper class 를 구현하여 사용해도 되겠지만, 일반적으로 Java에서 지원하는 Integer, Long, Double 등의 class를 사용하는 것이 편리하다.
이 클래스들은 일반적으로 생성자 함수에 데이터를 넣고, -value 함수를 이용하여 데이터를 꺼내오게 되는데 이를 Boxing, Unboxing이라고 한다.
예시는 아래와 같다.
Java 1.5 버전부터는 AutoBoxing과 AutoUnboxing을 제공하고 있는데 이를 이용하면 위와 같이 명시적으로 객체를 생성하고, 함수를 이용하여 Unboxing 하던 것을 간소화하여 사용할 수 있게 된다.
하지만 AutoBoxing과 AutoUnboxing이 된다고 해서 무조건 return되는 타입이 기본형 타입일 것이라고 착각해서는 안된다.
AutoBoxing의 경우 특정 범위만큼의 cache를 통해서 지원되는데 defualt로 주어지는 범위는 -128 ~ 127까지이다.
(cache의 범위는 프로그램 실행시에 옵션을 줘서 추가할 수 있다.)
그렇기 때문에 단순히 Ingeger 타입의 두 변수에 같은 값을 넣었더라도 결과가 서로 달라질 수 있게 된다.
위의 코드를 살펴보면, a1과 b1은 위에서 말한 cache의 범위 안에 들어오기 때문에 '==' 연산을 이용하여 비교하더라도 true가 나오게 된다.
즉 a1과 b1은 기본형 타입으로 반환되기 때문에 두 변수가 같은 값을 갖고 있는 것이 확인되는 것이다.
하지만 cache 범위를 넘어서게 되면 변수에서는 실제 저장되어있는 기본형 자료의 값을 가져오는 것이 아닌 주소값을 가져와 비교하는 것이 되기 때문에 감싸고 있는 데이터의 크기는 동일하지만 다른 값이라고 나오게 되는 것이다.
그렇기 때문에 wrapper class에 저장된 자료를 비교하기 위해서는 equals 함수를 사용하거나 - 연산 등을 이용하여 비교하는 방식을 취해야 한다.
참조
'Java > Java 기초' 카테고리의 다른 글
Java Reflection 사용하기 (2) (0) | 2019.02.12 |
---|---|
Java Reflection 사용하기 (1) (0) | 2019.02.12 |
Properties Class 사용 (0) | 2018.06.12 |
SHA256 encoding (0) | 2018.05.31 |
Base62 encoding decoding (0) | 2018.05.29 |