객체지향 개념에서 모든 것은 객체로 다루어져야 한다. 그러나 자바에서는 8개의 기본형(int, boolean 등등)을 객체로 다루지 않는데 이것이 바로 자바가 완전한 객체지향 언어가 아니라는 얘기를 듣는 이유이다. 그 대신 보다 높은 성능을 얻을 수 있었다.
때로는 기본형 변수도 어쩔 수 없이 객체로 다뤄야 할 하는 경우가 있다. 예를들면, 매개변수로 객체를 요구할 때, 기본형 값이 아닌 객체로 저장해야할 때, 객체간의 비교가 필요할 때 등등의 경우에는 기본형 값들을 객체로 변환하여 작업을 수행해야 한다.
이때 사용되는 것이 래퍼(Wrapper) 클래스 이다. 8개의 기본형을 대표하는 8개의 래퍼클래스가 있는데, 이 클래스들은 이용하면 기본형 값을 객체로 다룰 수 있다.
기본형 | 래퍼클래스 | 기본형 | 래퍼클래스 |
boolean | Boolean | char | Character |
byte | Byte | int | Integer |
long | Long | short | Short |
float | Float | double | Double |
래퍼 클래스들은 모두 equals()가 오버라이딩 되어 있어서 주소값이 아닌 객체가 가지고 있는 값을 비교한다.
- Number 클래스
이 클래스는 추상클래스로 내부적으로 숫자를 멤버변수로 갖는 래퍼 클래스들의 조상이다.
Number클래스 자손으로 BigInteger와 BigDeciaml등이 있는데, BigInteger는 long으로도 다룰 수 없는 큰 범위의 정수를, BigDecimal은 double으로도 다룰 수 없는 큰 범위의 부돔 소수점수를 처리하기위한 것으로 연산자의 역할을 대신하는 다양한 메서드를 제공한다.
- 문자열을 숫자로 변환하기
전자는 반환값이 기본형이고 후자는 반환값이 래퍼 클래스 타입이라는 차이가 있다.
JDK1.5부터는 오토박싱 기능 때문에 반환값이 기본형일 때와 래퍼클래스일 때의 차이가 없어졌다.
그래서 그냥 구별없이 valueOf()를 쓰는 것도 괜찮은 방법이지만 성능은 좀 더 느리다.
- 오토박싱, 언박싱
JDK 1.5이전에는 기본형과 참조형간의 연산이 불가능 했기 때문에, 래퍼 클래스로 기본형 객체를 만들어서 연산해야 했지만 이제는 기본형과 참조형 간의 덧셈이 가능하다. 자바 언어의 규칙이 바뀐게 아니고 컴파일러가 자동으로 변환하는 코드를 넣어준기 때문이다.
이 외에도 내부적으로 객체 배열을 가지고 있는 Vector클래스나 ArrayList클래스에 기본형 값을 저장해야할 때나 형변환이 필요할 때도 컴파일러가 자동적으로 코드를 추가해준다. 기본형 값을 래퍼 클래스의 객체로 자동 변환해주는 것을 '오토박싱 (Autoboxing)'이라고 하고 반대로 변환하는 것을 '언박싱(unboxing)'이라고 한다.
'Java' 카테고리의 다른 글
[Java] 원시 타입과 참조 타입 정리: 오토박싱과 언박싱 쉽게 이해하기 (0) | 2024.09.06 |
---|---|
[Java] 자바에서의 배열 복사 방법( arraycopy(), copyOfRange(), copyOf() ) (0) | 2024.04.05 |
[Java] String.split 함수 (0) | 2024.04.05 |