🙄 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 |