자바의 자료형은 기본 타입(primitive type)와 참조 타입(reference type)로 나누어지는데 기본타입의 데이터를 객체로 취급해야하는 경우가 있다. 이럴 때 쓰는게 wrapper class인데 기본타입을 객체 형태로 포장하는 것을 의미한다.
- 기본 타입 : 정수, 실수, 문자, 논리형의 실제 데이터 값 저장
- 참조 타입 : 객체의 번지를 참조(주소 저장)
메소드 인수로 객체 타입만이 요구된다면 기본 타입의 데이터를 그대로 사용할 수 없기 때문에 기본 타입의 데이터를 객체로 변환한 후에 작업을 수행해야 한다.
왜 wrapper class가 필요한가 싶은데
- 메서드에 전달된 arguments를 수정하기 위해서는 기본형 변수들을 참조형 변수로 변환해야한다.(기본 형 변수는 값으로 전달되기 때문)
- java.util 패키지의 클래스들은 참조형 변수만을 다룬다.
- ArrayList와 Vetcor은 참조형 변수만을 다룬다.
- 멀티쓰레딩에서 동기화를 지원하려면 참조형 변수가 필요하다.
보통 두 가지 경우에 자주 쓰이는데
- Generic(제네릭)
- 정해진 형식에 의존하지 않고, 클래스 외부에서 접근할 때의 재사용성을 높이 위해 사용하는 제네릭. 가령 ArrayList<Integer> xx처럼 컬렉션 형태의 변수를 선언할 때, 제네릭 타입의 <Integer>가 자바의 int 자료형과 매핑되는 래퍼 클래스이다.
- Casting(형 변환)
- String 형태인 정수 타입의 변수를 int 형태의 기본 타입으로 casting 할 때, Integer 래퍼 클래스의 parseInt()라는 메소드를 사용하여 캐스팅을 진행한다.
wrapper class를 더 정확히 이해하려면 박싱과 언박싱의 개념을 알고 있어야한다. 래퍼 클래스는 산술 연산을 위해서 정의된 클래스가 아닌, 형변환과 비교연산을 하기위해 정의된 클래스이다.
그래서 인스턴스에 저장된 값을 변경할 수 없다. 그냥 단순하게 값을 참조하기 위해 새로운 인스턴스를 생성하고, 생성된 인스턴스 값만을 참조할 수 있다.
- 박싱 (Boxing)
- 기본 타입의 데이터를 래퍼 클래스의 인스턴스로 변환하는 과정
- 언박싱(UnBoxing)
- 래퍼 클래스의 인스턴스에 저장된 값을 다시 기본 타입의 데이터로 꺼내는 과정
JDK1.5부터는 컴파일러가 박싱과 언박싱을 자동으로 처리해준다.
이렇게 자동화된 박싱과 언박싱을 오토 박싱(AutoBoxing), 오토 언박싱(AutoUnBoxing)이라 부른다.
다음은 기본과 오토의 차이를 보여주는 건데
public class prog {
public static void main(String[] args) {
Integer num = new Integer(17); // 박싱
int n = num.intValue(); // 언박싱
System.out.println(n);
Character ch = 'X'; // Character ch = new Character('X'); : 오토박싱
char c = ch; // char c = ch.charValue(); : 오토언박싱
System.out.println(c);
}
}
래퍼 클래스인 Integer 클래스와 Character 클래스에는 각각 언박싱을 위한 intValue(), charValue() 메소드가 포함되어 있다.
또한 오토 박싱을 이용하면 new 키워드를 사용하지 않고도 Character 인스턴스 생성이 가능하다.
반대로 charValue() 메소드를 사용하지 않고도, 오토 언박싱을 이용하여 인스턴스에 저장된 값을 바로 참조할 수 있다.
'Language > JAVA' 카테고리의 다른 글
문자열 형변환 toString vs String.valueOf() (0) | 2023.05.25 |
---|---|
특정 문자 위치 찾기(indexOf/lastIndexOf) (0) | 2023.05.16 |
클래스 메서드 VS 인스턴스 메서드 (0) | 2023.05.16 |