1. 래퍼 클래스란?
자바에서 자료형은 기본형(Primitive Type)과 참조형(Reference Type)으로 나누어집니다. 프로그래밍을 하다 기본형의 데이터를 객체로 표현해야 하는 경우가 생기는데 이럴 때 기본형을 객체로 다루기 위해 사용하는 클래스를 래퍼클래스(Wrapper Class)라고 합니다. 지금부터 래퍼클래스에 대해 자세히 알아봅시다.
2. 래퍼 클래스가 생긴 이유?
기본형(Primitive Type)은 객체가 아니기 때문에 다음과 같은 한계점이 존재합니다.
- 객체가 아니다 : 객체가 아니기 때문에 객체지향의 장점을 살릴 수 없다(메소드 제공 불가)
- null 값을 가질 수 없다 : 기본형은 항상 값을 가지기 때문에 null 표현을 할 수 없다.
이런 단점을 해결하기 위해 기본형을 객체로 감싸서 더 편리하게 사용하도록 자바는 기본형에 대응 하는 래퍼 클래스를 기본으로 제공합니다.
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
자바에서 제공하는 래퍼클래스
래퍼 클래스는 기본형 변수를 편리하게 사용하도록 다양한 메서드를 제공합니다. 또한 객체의 경우 데이터가 없다는 null을 표현할 수 있을 뿐만아니라 컬렉션 프레임워크나 제너릭 등에서 유용하게 사용할 수 있습니다.
3. 박싱(Boxing) 언박싱(Unboxing)
기본형을 래퍼 클래스로 변경하는 것을 물건에 넣은 것 같다고 해서 박싱(Boxing)이라 표현하고 래퍼 클래스에 있는 기본형 값을 다시 꺼내는 과정을 언박싱(Unboxing)이라 합니다.
Integer num = new Integer(10);// 박싱(boxing)
int n = num.intValue(); // 언박싱(unboxing)
intValue() : 래퍼 클래스에 들어있는 기본형 값을 꺼내는 메서드
4. 래퍼 클래스의 비교
래퍼 클래스는 객체이기 때문에 == 비교를 하면 인스턴스의 참조 값을 비교하기 때문에 값을 비교하려면 equals()를 사용해야 합니다.
Integer num1 = new Integer(10);
Integer num2 = new Integer(10);
System.out.println(num1 == num2); // false
System.out.println(num1.equals(num2)); // true
5. 오토 박싱(Auto-Boxing) 오토 언박싱(Auto-Unboxing)
오토 박싱과 오토 언박싱은 컴파일러가 대신 valueOf, xxxValue()등을 추가해주는 기능으로 기본형과 래퍼 클래스를 서로 편리하게 변환할 수 있습니다.
int num = 10;
Integer boxedNum = num; // Auto Boxing == Integer.valueOf(num);
int unboxedNum = boxedNum; // Auto Unboxing == boxedNum.intValue();
+래퍼 클래스의 성능
래퍼 클래스는 기본형보다 다양한 기능을 제공합니다. 하지만 객체이기 때문에 메타데이터를 포함으로 기본형보다 더 많은 메모리를 사용하게 됩니다.
public static void main(String[] args){
long sum = 0L;
long startTime = System.currentTimeMillis();
for(int i = 0; i < 1000000; i++) {
sum += i;
}
long endTime = System.currentTimeMillis();
System.out.print(endTime - startTime +"ms");
}
public static void main(String[] args){
Long sum = 0L;
long startTime = System.currentTimeMillis();
for(int i = 0; i < 1000000; i++) {
sum += i; //오토박싱 발생
}
long endTime = System.currentTimeMillis();
System.out.print(endTime - startTime +"ms");
}
(엄청난 양의 연산을 연속해서 수행하는 경우라면 기본형을 사용하는 최적화를 고려하고 그것이 아니라면 자바에서 제공하는 래퍼 클래스를 유용하게 잘 사용하자!)
'JAVA' 카테고리의 다른 글
[JAVA] 가비지 컬렉션이란? (Garbage Collection) 1편 (0) | 2024.06.04 |
---|---|
[JAVA] Call by Value, Call by Reference (0) | 2024.06.03 |
[JAVA] ENUM 이란? (0) | 2024.05.28 |
[JAVA] JVM(Java Virtual Machine) (0) | 2023.07.11 |
[JAVA] String이 불변(immutable)인 이유? (0) | 2023.04.11 |