📝느낀 점
박싱, 언박싱에 대해 알고는 있었으나 이것을 "왜? 알아야 할까?" 하는 나의 질문에 답변을 하지 못하였다.
즉, 프로그래밍 언어를 사용하면서 필요하다는 건 알겠으니, 알고는 있어야 겠지? 이런 느낌이였다.
하지만, 다시 생각을 바로 잡고 하나하나 왜 쓰는지, 왜 필요한지, 이거에 대한 활용도는 뭔지 등등 천천히 생각을
바로 하며 정리해 나갔으면 좋겠다. 박싱과 언박싱은 결국, Primitive 타입에서 -> reference 타입으로 변환 해주는 과정을
말한다. 그리고 언박싱이란 그 반대이다. 중요한건 박싱을 함으로써 자료구조 같은 기본 자료형이 아닌 레퍼런스 타입을 필요로 하는 경우가 많기 때문이다. 그리고 언박싱은 메모리를 더 효율적으로 사용하기 위해 생겨난 개념이라고 생각한다.
박싱(boxing), 언박싱(un-boxing)
- 박싱은 기본 자료형의 데이터를 래퍼 클래스의 객체로 만드는 과정을 의미한다
- 언박싱은 래퍼 클래스의 데이터를 기본 자료형으로 얻어내는 과정을 말한다.
(예 : int → Integer 박싱 / Integer → int 언박싱)
Boxing Primitive 자료형 -> Wrapper 클래스
Unboxing | Wrapper 클래스 -> Primitive 자료형 |
래퍼 클래스란?
기본 자료형(Primitive data type)에 대한 객체 표현을 Wrapper class라고 한다.
기본 자료형의 값을 감싸 객체 형태로 만든 것이 바로 래퍼 클래스이다.
자료형에는 두가지가 있다.
- 기본형(=primary) → int a = 1;
- 참조형(=reference) → new 연산자를 사용하여
- 객체로 만든 것을 참조형이라고 한다. → Human b = new Human();
래퍼 클래스의 특징은?
- '==' 연산자가 불가능하다
- ‘==’ 비교자는 primary때랑 reference때랑 다르다
- primary 때는 값을 비교한다.
- reference 때는 참조 주소를 비교한다.
- ‘==’ 비교자는 primary때랑 reference때랑 다르다
- Immutable(=불변) 하다는 특징이다.
- Integer a = 1; 이라고 되어 있다고 생각해보자.
- 1에서 2로 수정 하였다면, 2라는 객체가 새로 생성되어서 변경된다.
- 즉, 기존값이 변경되는 것이 아니고, 새로운 값이 할당된다는 것이다.
- Integer a = 1; 이라고 되어 있다고 생각해보자.
사용 이유
기본 자료형의 값을 굳이 래퍼 클래스로 포장하는 이유는 제네릭, 자료구조 등 기본 자료형이 아닌
레퍼런스 타입을 필요로 하는 경우가 많고, 메서드를 갖고 있어 다양하게 활용이 가능하기 때문이다.
박싱을 해야 하고, 언박싱을 해야 하는 이유는?
메모리 성능을 효율적으로 관리하기 위해 박싱과 언박싱이 필요합니다.
- 기본 타입은 메모리에 직접 값을 저장하므로 효율적 입니다.
- 참조 타입은 메모리에 객체의 주소값을 저장합니다.
- 그렇기에, 메모리 사용 측면에서 비효율적일 수 있습니다.
자바는 모든 객체를 힙에 저장합니다.
그런데, 힙 영역은 상대적으로 스택 영역에서 불러올 때보다 속도가 떨어집니다.
속도를 버려가면서, primitive 타입으로 표현해도 문제되지 않는 부분까지
일부러 래퍼 클래스로 만드는 것은 불필요하기에 래퍼클래스만을 활용하지 않는다는 것입니다.
그리하여
래퍼 클래스는 이 두 가지 타입 사이의 다리 역할을 해줍니다.
원시 타입을 래퍼 클래스로 박싱(Boxing)하면, 원시 타입도 객체 지향 프로그래밍에 적합하게 활용할 수 있게 됩니다.
예시)
ArrayList 같은 컬렉션은 원시 타입을 직접 담을 수 없습니다.
하지만 원시 타입을 래퍼 클래스로 박싱 하면 컬렉션에 저장할 수 있게 됩니다.
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.add(i); // i는 자동으로 Integer 객체로 박싱된다.
}
반대로,
래퍼 클래스의 값을 원시 타입처럼 취급해야 할 때는
언박싱(Unboxing)이 필요하게 됩니다. (=자동 언박싱 된다)
Integer boxedInt = new Integer(123);
int autoUnboxedInt = boxedInt; // 자동 언박싱
'Java' 카테고리의 다른 글
enum 사용하는 이유는 무엇인가요? (0) | 2023.11.07 |
---|---|
제네릭이 필요한 이유는 무엇인가요? (0) | 2023.11.06 |
추상클래스와 인터페이스의 용도를 나눈 이유는 무엇인가요? (0) | 2023.11.06 |
오버로딩, 오버라이딩 설명 (0) | 2023.11.06 |
변수들은 JVM에서 어디에 할당 되나요? / 클래스와 객체 차이 (0) | 2023.11.06 |