자바 공부 중 Wrapper Class에 대한 내용이 헷갈려 정리한 것에 대한 기록이다. 아래 책을 공부 중이다.
신용권, 임경균, 『이것이 자바다』, 한빛미디어(2023), p120-121.
참고한 블로그 글들이다.
https://velog.io/@dmchoi224/Wrapper-%ED%81%B4%EB%9E%98%EC%8A%A4
Wrapper Class란
Wrapper class는 기본 타입을 객체로 다루기 위해서 사용하는 클래스이다.
이를 이해하기 위해서는 먼저 기본 타입(primitive type)과 참조 타입(reference type)에 대한 이해가 있어야 한다. 기본 타입은 char, int, float, double, boolean 등의 우리가 아는 일반적인 타입이다. 참조 타입은 class, interface 등의 타입이다. 기본 타입을 가진 값들을 참조 타입 객체로 표현하기 위해서 사용되는 것이 Wrapper class이다.
이렇게 기본 타입에서 객체 형태로 만들게 되면 불변성을 가지게 되어 wrapper 클래스 안에 객체의 값은 변경이 불가능하다.
Wrapper 객체를 생성하기 위한 클래스는 java.lang 패키지에 포함되어 있고, char과 int를 제외하고는 기본 타입의 첫 문자를 대문자로 바꾼 이름을 가지고 있다.
기본 타입 | 포장 클래스 |
byte | Byte |
char | Character |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
Boxing과 Unboxing
기본 타입의 값을 포장 객체로 만드는 과정을 박싱(boxing), 포장 객체에서 기본 타입의 값을 얻어내는 과정을 언박싱(unboxing)이라고 한다. 예시는 아래와 같다.
public class BoxingUnboxing {
public static void main(String[] args) {
Integer obj = 100; // boxing
int value = obj; // unboxing
int result = obj + 100; // 연산 시 자동으로 unboxing
}
}
Wrapper Class를 사용하는 이유
이렇게까지 공부하고 나서도 생기는 나의 근본적인 의문이 있었다. 왜 wrapper class를 사용해 가면서 까지 기본 타입을 객체로 만들어야 하는가? 값을 바꿀 수도 없어 연산을 수행할 수도 없는데, 굳이 객체로 만드는 이유가 궁금했다. 검색을 하며 공부한 결과 주로 아래 두 가지 이유로 사용된다.
첫 번째 이유는 제네릭(Generic)이다. 제네릭은 자료형을 정하지 않는 기법이다. 예를 들어 아래와 같이 Generic이라는 클래스를 선언하면 T는 아직 정해지지 않은 타입이 되고, Generic class의 객체를 만들 때, T에 어떤 타입이 들어갈지 결정하게 된다. 이때 타입은 꼭 Wrapper class를 사용해주어야 한다.
public class Generic<T> {
public T data;
}
public class GenericExample {
public static void main(String[] args) {
Generic<Integer> generic = new Generic<Integer>();
generic.data = 10;
}
}
두 번째 이유는 기본형 타입을 객체로 다뤄야 하는 경우가 있기 때문이다. 예를 들어 하나의 배열에 여러 가지 데이터 타입을 넣고 싶다면 Object를 사용하고 그 안에서는 Wrapper class를 사용하여 요소들을 넣어준다.
Object[] objAry = {
new Integer(10),
new Double(10.5),
new String("안녕")
};
혹은 매개변수를 객체로 넘겨야 하는 경우도 있다.
public class Wrapper {
public static void func(Object a) {
System.out.println(String.valueOf(a));
}
public static void main(String[] args) {
func(new Integer(10));
}
}
'개발 언어 및 알고리즘 기초 > JAVA 기초' 카테고리의 다른 글
[Java] Thread Pool (스레드 풀) (0) | 2024.04.27 |
---|---|
[Java] 스트림(Stream) 요소 처리 (0) | 2024.04.25 |
[JAVA] StringBuilder로 문자열 조작하기 (0) | 2024.04.17 |
[JAVA] Collection Framework 정리 (0) | 2024.04.12 |
[JAVA] Thread 상태 (0) | 2024.04.10 |