본문 바로가기
Programing General/Java

[Java] int와 Integer의 차이

by Gnaseel 2020. 4. 27.
728x90
반응형

int와 Integer은 쓰임새가 유사한 것 같으면서도 다르다.

정확하게 개념을 짚어놓지 않으면 코딩할 때 왜 이 메소드에서 매개변수를 틀렸다고 하는지, 어떻게 변환해서 사용하는게 옳바른지 등 헷갈리기 쉽기 때문에 간단하게 정리를 해보자.

 

 primitive data type vs class

 

가장 큰 차이이자 핵심이다.

int는 자바의 원시 자료형이고, Integer는 자바의 클래스이다.

 

자바는 객체지향 언어이기 때문에, 상당수의 연산을 객체의 형태를 사용해서 수행한다.

하지만 객체의 연산은 오버헤드가 발생할 수 밖에 없기 때문에, 자주 사용되는 8개의 형태를 원시 자료형으로 남겨놔서 사용할 수 있게 해줬다. int, double, boolean 등등.. 

 

그러니까 사용법이 달라진다...

 

예를 들어서 자바 개발자라면 항상 보게되는 HashMap 자료구조에서 차이점을 찾아보자.

HashMap은 보통 이렇게 정의한다.

HashMap<K, V> hm = new HashMap<K, V>();

 

여기서K와 V에 들어갈 수 있는 것은 객체 뿐이다.

그래서 우리는 정수형 키와 값을 가진 해시맵을 정의할 때는

HashMap<Integer, Integer> hMap = new HashMap<Integer, Integer>();

를 사용해야 한다.

 

원시 자료형인 int는 사용할 수 없고, 같은 이유로 double, boolean도 사용할 수 없다.

int를 사용하고 싶다면 int의 wrapper인 Integer 객체를 사용해야 하고,

double은 Double, boolean은 Boolean 객체를 사용해야 정상적으로 작동한다.

 

해시맵에서 왜 원시 자료형을 받지 않고 객체를 받느냐고 한다면,

그것은 객체지향적 언어인 java가 다형성을 지키기 위해서라고 대답할 수 있다.

 

햇갈린 이유?

 

위의 예시를 계속 사용해보자.

우리가 해시맵에서 정수형으로 된 키를 사용할 때

hMap.get(3);

이러한 형태로 사용하게 된다.

 

조금 모순이지 않은가?

분명 다형성을 위해서 원시 자료형이 아닌 객체의 형태로 저장하는데 원시 자료형인 3, 즉 int를 그냥 사용하고 있는 것이다.

이것은 객체와 객체 사이의 형변환도, 자료형과 자료형 사이의 형변환도 아닌 원시 자료형을 객체처럼 사용한 것이다.

많은 사람들이 이것 때문에 햇갈렸을 것이라고 생각한다.

 

결론만 말하자면 이러한 형변환은 AutoBoxing이라고 한다.

상세히 설명하자면 너무 길어져 다른 포스트에서 설명하도록 하고, 간단하게 원시 자료형을 wrapper객체의 형태로 자동으로 변환해준다고 생각하면 된다.

 

마지막으로 눈치가 빠르다면 하나 의문이 생길수도 있는데 String은 해시맵의 매개변수로 사용될 때 별도의 변환과정이 없다.

왜냐하면 java에서 String은 원시 자료형이 아니라 그 자체로 하나의 객체이기 때문이다.

String은 int, boolean 등 과는 전혀 다른 객체이다.

 

 

반응형