[Java] 래퍼 클래스(Wrapper Class)
원시 타입(Primitive Type)과 참조 타입(Reference Type)
자바의 데이터 타입에는 원시 타입(Primitive Type)과 참조 타입(Reference Type)이 있다.
원시 타입은 정수, 실수, 문자, 논리 리터럴 등 실제 데이터 값을 저장하는 타입이다.
참조 타입은 기본 타입을 제외한 타입으로, 객체의 주소를 저장하여 객체를 참조하는 타입이다. 클래스와 인터페이스 등이 있다.
래퍼 클래스(Wrapper Class)
원시 타입 | 래퍼 클래스 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
char | Character |
래퍼 클래스(Wrapper Class)는원시 타입의 값을 감싸는 클래스이다.
원시 타입의 값들도 객체로 표현해야 하는 경우가 있는데, 이런 상황에서 래퍼 클래스를 사용한다. 래퍼클래스는 값은 인스턴스로 감싸고, 인스턴스에서 값을 꺼내는 기능을 가진다.
래퍼 인스턴스는 담고 있는 값을 수정하지 못하므로 값의 수정이 필요하면 새로운 래퍼 인스턴스를 생성해야 한다.
박싱(Boxing)과 언박싱(Unboxing)
값을 인스턴스에 감싸는 행위를 박싱(Boxing)이라고 하고, 저장된 값을 꺼내는 행위를 언박싱(Unboxing)이라고 한다. 박싱은 인스턴스의 생성을 통해 이루어지고, 언박싱은 메서드 호출을 통해 이뤄진다.
Integer obj = Integer.valueOf(13); // 박싱
int num = Integer.intValue(); // 언박싱
자바 9부터 래퍼 클래스의 생성자가 depreciated 되었다. 대신 static factory인 valueOf 를 사용한다.
자바 5부터 박싱과 언박싱이 필요한 상황에서 자동으로 처리하기 시작했다. 이를 오토 박싱(Auto Boxing), 오토 언박싱(Auto Unboxing)이라고 한다.
Integer obj = 13;
Integer obj = Integer.valueOf(13); // 다음과 같이 수정되어 실행됨
int num = obj;
int num = obj.intValue(); // 다음과 같이 수정되어 실행됨
num++;
new Integer(num.intValue() + 1); // 오토 박싱, 언박싱 동시 진행
위의 예제처럼 문장이 수정되어 실행된다.
래퍼 클래스의 구조와 Number, BigInterger, BigDecimal
위의 그림은 래퍼 클래스의 계층 구조를 보여준다. 이 중, 숫자를 다루는 원시 타입의 래퍼 클래스들의 상위 클래스는 Number 클래스이다.
Number 클래스는 추상 클래스이다. intValue, floatValue 등의 추상 메서드들이 존재하여 객체에 저장된 값을 다양한 형태로 반환할 수 있다. Number 클래스의 하위 클래스들 중 위에서 언급한 래퍼 클래스들 이외에 BigInteger 클래스와 BigDecimal 클래스가 있다.
BigInteger big = new BigInteger("100000000000000000000000000000000");
BigInteger 클래스는 long 타입으로도 표현 불가능한 수를 표현할 때 사용한다. 문자열을 사용해 인스턴스를 생성하며 사칙연산을 포함한 다양한 연산을 위한 메서드가 정의되어 있다.
BigDecimal big = new BigDecimal("1.6");
BigDecimal 클래스는 오차 없는 실수의 표현을 위해 제공되는 클래스이다. dobule 타입은 내부적으로 수를 저장할 때 이진수의 근사치를 저장하여 오차가 발생한다. BigDecimal 타입을 사용하면 오차가 거의 존재하지 않게 되므로 돈과 소수점을 다룬다면 필수적으로 사용해야 한다. 문자열을 사용해 인스턴스를 생성하며 사칙연산을 포함한 다양한 연산을 위한 메서드가 정의되어 있다.
참조
윤성우의 열혈 JAVA 프로그래밍
https://coding-factory.tistory.com/547