Programming/Java

Java Primitive Type (원시 타입), Wrapper Class (래퍼 클래스) 차이점

Jan92 2021. 8. 4. 01:14

프로젝트를 하면서 대부분의 경우에 Long을 쓰면서 가끔 어떤 경우에서는 IntelliJ가 자동으로 Longlong으로 바꿔주는 경우가 있었습니다.

왜 그런지 이유를 몰랐고, 궁금하지도 않았다는 것을 반성하며 Java의 원시 타입 Primitive Type과 래퍼 클래스 Wrapper Class의 차이에 대해서 알아보았습니다.

 

 

먼저 Primitive Type, Wrapper Class에 어떤 것들이 해당하는지 보겠습니다.

Primitive Type Wrapper Class
byte Byte
short Short
int Integer
long Long
float Float
double Double
boolean Boolean
char Character

 

원시 타입으로는 byte, short, int, long, float, double, boolean, char 이 있고, 래퍼 클래스로는 Byte, Short, Integer, Long, Float, Double, Boolean, Character 가 있습니다.

 


 

 

그렇다면 Primitive Type과 Wrapper Class는 무슨 차이가 있을까요?

결론적으로 Wrapper Class는 Primitive Type을 객체화한 것입니다.

 

* wrap : 포장하다

말 그대로 원시 타입을 객체로 포장한 것입니다.

 

int primitive = 10;
Integer wrapper = 10;

wrapper = null;  // null 값이 들어갈 수 있습니다.
String str = wrapper.toString();  // 메서드를 사용할 수 있습니다.
ArrayList<Integer> integerList = new ArrayList();  // 제네릭에 사용할 수 있습니다.

intInteger를 예로 든다면 int의 경우 단순하게 숫자로서만 사용할 수 있지만 Integer의 경우 객체 형태로 생성되어 null 값이 들어갈 수 있고,. toString과 같은 메서드를 사용할 수 있으며, 제네릭 <Integer>의 형태로도 사용할 수 있게 됩니다.

 

 

그렇다면 어떤 상황에서 primitive type을 사용하고 어떤 상황에서 wrapper class를 사용할까요?

 

결국 사용 용도에 따라 다르겠지만 일반적으로는 primitive type을 많이 사용합니다. wrapper의 경우 결국 객체를 생성하는 것인데, 굳이 객체가 필요한 경우가 없거나 null값을 반환할 필요가 없다면 객체를 생성하지 않고 primitive type을 사용하는 것이 메모리의 측면에서 효율적입니다.

또한 wrapper의 경우 객체이기 때문에 == 연산이 아닌 equals() 메소드를 이용해서 값을 비교해야 합니다. 그렇기 때문에 직관적으로 값을 비교함에 있어서도 primitive가 편리합니다.

 

* 객체에서의 == 연산은 두 객체의 주소 값을 비교하는 것

 

 

 


 

여기서 Wrapper Class와 Primitive Type에 대해서 좀 더 알아본다면 Boxing과 UnBoxing의 개념이 있습니다.

 

int primitive = 30;
Integer wrapper = new Integer(primitive);

Boxing이란 원시 타입을 포장 클래스로 변환하는 것입니다.

 

 

Integer wrapper = new Integer(30);
int primitive = wrapper.intValue();

UnBoxing은 포장 클래스를 원시 타입으로 변환하는 것입니다.

 

 

Integer wrapper = 10;
int primitive = 10;

// autoBoxing, autoUnBoxing
wrapper = (Integer)primitive; // boxing (Primitive to Wrapper)
primitive = (int)wrapper; // unboxing (Wrapper to Primitive)

/* 보여주기 위해 (Integer), (int) 형변환을 붙인 것이고 실제로는 없어도 자동 변환

하지만 JDK 1.5 부터는 autoBoxing, autoUnBoxing 이라는 것이 적용되어 자동적으로 primitive type과 wrapper class를 형변환해주고 있습니다.