밍 석
밍석의 devlog
밍 석
  • 분류 전체보기 (58)
    • 글쓰기(=writing) (8)
      • 어떤 개발자가 되고 싶은가? (1)
      • 깊이 학습 한다는 것은? (1)
      • 23년 생각 정리 + (회고) (1)
    • TIL (=Today I Learned) (0)
    • 프로젝트(project) (2)
      • ERD 설계 느낀 점 (1)
      • AWS 배포 느낀 점 (1)
    • aws (8)
    • Java (28)
    • Spring (0)
    • Linux (1)
    • git (3)
    • ETC (4)
      • h2 DB 설치 (0)
      • 우아한 테크코스 (백엔드) (4)
      • IntelliJ IDEA (0)
    • project 환경 세팅 (0)
    • Dev Book Review (0)
      • git 레포로 관리 -> 링크 (0)
    • 기록하고 싶은 글 (2)
전체 방문자
오늘
어제

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

최근 댓글

티스토리

hELLO · Designed By 정상우.
밍 석

개발과 관련된 내용을 기록하는 블로그

박싱(boxing), 언박싱(un-boxing)
Java

박싱(boxing), 언박싱(un-boxing)

2023. 11. 6. 23:43

📝느낀 점

박싱, 언박싱에 대해 알고는 있었으나 이것을 "왜? 알아야 할까?" 하는 나의 질문에 답변을 하지 못하였다.

즉, 프로그래밍 언어를 사용하면서 필요하다는 건 알겠으니, 알고는 있어야 겠지? 이런 느낌이였다.

하지만, 다시 생각을 바로 잡고 하나하나 왜 쓰는지, 왜 필요한지, 이거에 대한 활용도는 뭔지 등등 천천히 생각을

바로 하며 정리해 나갔으면 좋겠다. 박싱과 언박싱은 결국, Primitive 타입에서 -> reference 타입으로 변환 해주는 과정을 

말한다. 그리고 언박싱이란 그 반대이다. 중요한건 박싱을 함으로써 자료구조 같은 기본 자료형이 아닌 레퍼런스 타입을 필요로 하는 경우가 많기 때문이다. 그리고 언박싱은 메모리를 더 효율적으로 사용하기 위해 생겨난 개념이라고 생각한다.

 

 

박싱(boxing), 언박싱(un-boxing)

  • 박싱은 기본 자료형의 데이터를 래퍼 클래스의 객체로 만드는 과정을 의미한다
  • 언박싱은 래퍼 클래스의 데이터를 기본 자료형으로 얻어내는 과정을 말한다.

 

(예 : int → Integer 박싱 / Integer → int 언박싱)

Boxing Primitive 자료형 -> Wrapper 클래스

Unboxing Wrapper 클래스 -> Primitive 자료형

 

 

래퍼 클래스란?

기본 자료형(Primitive data type)에 대한 객체 표현을 Wrapper class라고 한다.

기본 자료형의 값을 감싸 객체 형태로 만든 것이 바로 래퍼 클래스이다.

 

 

자료형에는 두가지가 있다.

  1. 기본형(=primary) → int a = 1;
  2. 참조형(=reference) → new 연산자를 사용하여
  3. 객체로 만든 것을 참조형이라고 한다. → Human b = new Human();

 

 

래퍼 클래스의 특징은?

  1. '==' 연산자가 불가능하다
    • ‘==’ 비교자는 primary때랑 reference때랑 다르다
      • primary 때는 값을 비교한다.
      • reference 때는 참조 주소를 비교한다.
  2. Immutable(=불변) 하다는 특징이다.
    • Integer a = 1; 이라고 되어 있다고 생각해보자.
      • 1에서 2로 수정 하였다면, 2라는 객체가 새로 생성되어서 변경된다.
      • 즉, 기존값이 변경되는 것이 아니고, 새로운 값이 할당된다는 것이다.

 

 

사용 이유

기본 자료형의 값을 굳이 래퍼 클래스로 포장하는 이유는 제네릭, 자료구조 등 기본 자료형이 아닌

레퍼런스 타입을 필요로 하는 경우가 많고, 메서드를 갖고 있어 다양하게 활용이 가능하기 때문이다.

 

 

박싱을 해야 하고, 언박싱을 해야 하는 이유는?

메모리 성능을 효율적으로 관리하기 위해 박싱과 언박싱이 필요합니다.

  • 기본 타입은 메모리에 직접 값을 저장하므로 효율적 입니다.
  • 참조 타입은 메모리에 객체의 주소값을 저장합니다.
    • 그렇기에, 메모리 사용 측면에서 비효율적일 수 있습니다.

 

 

자바는 모든 객체를 힙에 저장합니다.

그런데, 힙 영역은 상대적으로 스택 영역에서 불러올 때보다 속도가 떨어집니다.

속도를 버려가면서, 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
    밍 석
    밍 석
    밍 석

    티스토리툴바