Antilog의 개발로 쓰다
반응형

🙄 Auto Boxing 과 Auto Unboxing

auto boxing과 unboxing은 사실 java를 배울때 서적에도 적혀있는 내용이지만, 개념을 배운후에 개발하다 보면 사실 망각하기 쉬운 부분이기도 한 부분인데요

Wrapper Classes와 Primitive data type 사이에 이루어지는 자동변환을 방향에 따라서

Primitive type -> Wrapper class 를 Auto Boxing, 그 반대를 Auto Unboxing이라고 합니다.

개발을 하다보면 너무 당연하기에 자세하게 들여다 본적이 없다면.. 까먹기 쉬운 내용이며, 누군가 말해주지 않으면 생각하지도 못하는 부분이기도 합니다!


🤔 Primitive type? Java의 2가지 Type

▶ Primitive Types

Java에는 byte, short, int, long, float, double, char, boolean 과 같은 8가지 Primitive Type(원시 타입)이 있습니다.

위와 같은 8가지 Primitive Types는 Binary bit 형식으로 각자 자신의 값을 직접 가지고있습니다.

int number = 5 // number는 5라는 값을 직접 가지고있음.
int number = 1;
int otherNumber = 1;

// Number와 OtherNumber의 1은 해당 Primitive Type이 1이라는 값을 직접 가지기에 아래와 같은 비교 결과가 True가 됩니다.
System.out.println(number == otherNumber); 

// 결과 true

▶ Reference Types

Primitive가 아닌 모든 Type들은 Reference Types 이다.

Reference Type은 어떤 값을 직접 가지는게 아닌, 그 값을 가진 객체의 주소를 가지고있습니다.

Integer integerNumber = new Integer(1);
Integer otherIntegerNumber = new Integer(1);

// integerNumber와 otherIntegerNumber는 1이라는 Binary 값을 가지지 않습니다.
// 1이라는 값이 담긴 Integer class의 주소를 담고 있기에 이 2가지 값의 주소가 다르므로 False 라는 결과가 나옵니다.
System.out.println(integerNumber == otherIntegerNumber);

// 결과 false

위의 경우에서는 두 객체의 주소를 비교하고 있으므로 내부적으로 값이 같은지 확인하기 위해서는

Integer integerNumber = new Integer(1);
Integer otherIntegerNumber = new Integer(1);
System.out.println(integerNumber.equals(otherIntegerNumber));

equals 메소드를 사용하여 비교해야합니다.

String은 Primitive Type가 아니기 때문에 == 가 아닌 .equals()로 비교하는 것도 이와 같은 이유입니다.


Auto Boxing과 Auto Unboxing 이란?

위에서도 간단히 언급한대로

Wrapper Classes와 Primitive data type 사이에 이루어지는 자동변환을 방향에 따라서

Primitive type -> Wrapper class 를 Auto Boxing, 그 반대를 Auto Unboxing이라고 하는데,

 

보다 자세히 살펴보자면,

Java의 모든 Primitive type들은 각 Primitive type에 대한 Wrapper Class를 제공하고있습니다.

  • 간단하게 Wrapper Class는 각 원시타입을 원시타입에 해당하는 상자에 넣어 포장하거나 꺼내는 역할을 한다고 보시면 됩니다.

 

Primitive type 값을 Wrapper class의 인스턴스로 변환하여 쓰는 과정을 Boxing, 그 반대를 UnBoxing이라 합니다.

  • 원시 값을 객체란 상자에 포장하고, 포장을 푼다!

 

그런데 위와 같은 과정을 Java 1.5 부터 컴파일러가 자동으로 해주는 것이 Auto Boxing과 Auto UnBoxing이라고 합니다.

// auto Boxing
// integerNum은 Reference type입니다.
Integer integerNum = 300; // 컴파일러가 Integer integerNum = Interger.valueOf(300); 이렇게 변환합니다.

// auto Unboxing
// intNum은 Primitive type 입니다.
int intNum = integerNum; // 컴파일러가 int intNum = integerNum.intValue(); 이렇게 변환합니다.

부가적으로

valueOf()

Interger.valueOf(300);

위 코드는 아래와 같은 값을 만들어 냅니다.

new Interger(300);

즉, 새로운 Interger Class의 래퍼런스를 생성합니다.

intValue()

Integer number = Interger.valueOf(300).intValue();

위 코드는 아래와 같은 값을 만들어 냅니다.

int number = 300

즉, Integer(300)을 300이라는 Primitive type으로 뽑아옵니다.

반응형

'개발로 쓰는 공부 > Java 지식' 카테고리의 다른 글

[java] Integer Cache Class?  (0) 2020.11.23
[배경지식] Java 표준 API?  (0) 2020.02.24
profile

Antilog의 개발로 쓰다

@Parker_J_S

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...