int와 Integer의 차이(Wrapper Class)
목차
들어가기에 앞서 왜? int와 Integer의 차이에 대해 공부하게 되었는가를 말하겠다.
오늘 아침 다른 회사로 이직하시는 분과 커피를 마셨다. 이런저런 얘기를 하다가 면접에서 어떤 질문이 나왔는지 이야기를 하게 되었다.
첫 질문으로 int와 Integer의 차이를 물어봤다고 했다. 질문을 듣고 아무리 생각을 해봐도 정학한 대답을 할 수 없었다.
나름 컴퓨터공학과를 재학 중이고 서버 개발자가 되겠다고 공부했는데, 기초 중의 기초를 모르는 내 자신이 너무 부끄러웠다.
그래서 다시는 잊지 않기 위해 공부하고 포스팅을 시작한다.
1. Wrapper(포장) 클래스
자바의 자료형은 크게 기본 타입(primitive type)과 참조 타입(reference type)으로 나뉜다.
기본 타입은 byte, char, short, int, long, float, double, boolean 등이 있고 참조 타입은 class, interface 등이 있는데, 프로그래밍을 하다 보면 기본 타입의 데이터를 객체로 표현해야 하는 경우가 종종 있다.
이때 기본 자료타입(primitive type)을 객체로 다루기 위해서 사용하는 클래스들을 래퍼 클래스(wrapper class)라고 한다.
래퍼 클래스는 java.lang 패키지에 포함되어 있으며, 아래와 같이 기본 타입에 대응되는 래퍼 클래스들이 있다. char타입과 int타입이 각각 Character와 Integer의 래퍼 클래스를 가지고 있고 나머지는 기본 타입의 첫 글자를 대문자로 바꾼 이름을 가지고 있다.
기본타입/래퍼클래스
byte -> Byte
char -> Character
int -> Integer
floa -> Float
double -> Double
boolean -> Boolean
long -> Long
short -> Short
박싱(Boxing)과 언박싱(Unboxing)
기본 타입의 값을 포장 객체로 포장 객체로 만드는 과정을 박싱(Boxing)이라고 하고, 반대로 포장 객체에서 기본 타입의 값을 얻어내는 과정을 언박싱(Unboxing)이라고 한다.
//Boxing
Integer num1 = new Integer(10); //Deprecated
Integer num2 = Integer.valueOf(10);
//Unboxing
int num3 = num2.intValue();
int num4 = num2.intValue();
valueOf와 intValue 메서드를 호출해 박싱, 언박싱을 시켜줄 수 있다.
참고로 oracle java docs에 따르면 new Integer() 생성자는 자바 9부터 Deprecated 되었다.
인텔리제이에서 valueOf, intValue 메서드를 호출하면 밑줄이 생기는 것을 확인할 수 있다.

new Integer은 Deprecated 되었기 때문에 생긴 것이고, 나머지는 자동 박싱과 언박싱이 일어나 메서드를 쓸 필요가 없기 때문이다.
자동 박싱은 포장 클래스 타입에 기본값이 대입될 경우 자동 언박싱은 기본 타입에 포장 객체가 대입될 경우에 발생한다.
컬렉션 객체에 int 값을 저장하면 자동 박싱이 일어나 Integer 객체가 저장된다.
List<Integer> list = new ArrayList<>();
list.add(200); //자동 박싱이 일어남
문자열을 기본 타입 값으로 변환
포장 클래스의 주요 용도는 기본 타입의 값을 박싱해서 포장 객체로 만드는 것이지만, 문자열을 기본 타입 값으로 변환 할 때도 많이 사용된다.
int parseInt = Integer.parseInt("10");
‘parse + 기본타입’ 명으로 되어 있는 정적(static) 메소드를 사용하면 된다.
포장 값 비교
포장 객체는 내부의 값을 비교하기 위해 ==와 !=를 사용할 수 없다. 왜냐하면 내부 값이 아니라 참조를 비교하기 때문이다.
그러나 자바 명세에 보면 박싱된 값이 다음과 같으면 boolean(true, false), char(\u0000~\u007f), byte short int(-128 ~ 127) ==와!= 연산자로 내부의 값을 바로 비교할 수 있다.
그 이외의 경우에는 포장 클래스의 equals() 메소드를 사용하면 된다.
Integer obj1 = 10;
Integer obj2 = 10;
Integer obj3 = 300;
Integer obj4 = 300;
System.out.println(obj1 == obj2); //true
System.out.println(obj1.intValue() == obj2.intValue()); //true
System.out.println(obj1.equals(obj2)); //true
System.out.println(obj3 == obj4); //false
System.out.println(obj3.intValue() == obj4.intValue()); //true
System.out.println(obj3.equals(obj4)); //true
2. Wrapper 클래스를 사용하는 이유
Wrapper 클래스의 기능들을 간단히 살펴봤다.
그럼 왜 기본 타입이 아닌 래퍼 클래스를 사용하는 걸까?
다음과 같이 4가지로 정리할 수 있을 것 같다.
- 래퍼 클래스는 기본 데이터 타입을 오브젝트로 변환할 수 있다. 메소드에 전달된 인수를 수정하려는 경우 오브젝트가 필요하다.
- 거의 모든 패키지의 클래스들은 제네릭 타입을 파라미터로 받는다. 제네릭 타입은 래퍼 클래스만 들어갈 수 있다.
- 컬렉션 프레임 워크의 데이터 구조는 기본 타입이 아닌 객체만 저장할 수 있으며, 래퍼 클래스를 사용해 자동 박싱과 언박싱이 일어난다.
- 래퍼 클래스는 기본 타입과 다르게 null 값을 저장할 수 있다. 웹 서버의 경우 클라이언트에서 null 값이 왔을 때 기본 타입이면 예외가 발생한다.
참고
Overview (Java SE 11 & JDK 11 )
This document is divided into two sections: Java SE The Java Platform, Standard Edition (Java SE) APIs define the core Java platform for general-purpose computing. These APIs are in modules whose names start with java. JDK The Java Development Kit (JDK) AP...
docs.oracle.com
이것이 자바다
15년 이상 자바 언어를 교육해온 자바 전문강사의 노하우를 아낌 없이 담아낸 자바 입문서. 저자 직강의 인터넷 강의와 Q/A를 위한 커뮤니티(네이커 카페)까지 무료로 제공하여 자바 개발자로 가...
www.yes24.com
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] JVM (0) | 2021.10.25 |
---|---|
자바(Java) 버전별 특징 (0) | 2021.10.19 |
[스터디 할래] 6주차 - 상속 (0) | 2021.05.26 |
[스터디 할래] 5주차 - 클래스 (0) | 2021.05.26 |
java.util.Optional이란? (1) | 2021.05.26 |
댓글