마니의 공부방/Java

[java] int와 Integer의 차이

 

내 책장에는 가장 두꺼우면서도 오랫동안 버리거나 팔거나 하지않은 책이 딱 2권 있다.

java 기본 / spring 기본 !!!!

언젠가는 책상에 앉아서 기본을 다시 공부하리라 했는데.. 요즘 블로그를 다시 시작하면서 이웃분들의 글을 보고 이렇게 다시 책을 꺼내서 보고 자주 글을 올릴까 한다.

 

인터뷰 질문, int와 Integer의 차이에 대해 아시나요?

이전에 인터뷰 도중에 int와 Integer의 차이을 아는지에 대한 질문을 받은적이 있다.

물어보신분은 명료하게 "자료형이냐? 클래스냐?의 차이다"라고 하셨지만, 그 단순한 차이가 실제 업무에서 사용할때 고려해야하는 상황들이 참 많다. 

 

자료형과 Wrapper 클래스

int primitive 자료형으로, 산술연산이 가능하고, null로 초기화 할수없다.
Integer Wrapper클래스로, Unboxing을 하지 않으면 산술연산이 불가능하고, null값을 처리할수있다. 

null값을 처리할수있냐 없냐로 인해, 간혹 VO에서 DB상의 null을 처리하기위해 사용한다고 적힌글을 본적이 있습니다.

DB상에서 NULL과 '0'의 의미를 같게보냐, 다르게 보냐 할수있지만... 

 

NULL과 '0'의 논리적 의미

뭐 같으면 같다, 다르면 다르다 상황에 따라 다르게 혹은 같게 볼수있겠죠?

그런데 제 경험을 하나 이야기하자면, 예전 어떤 정산관련 화면에서 null이 0으로 들어왔는데, javascript처리조건에 해당값을 0으로 했을때,  0을 0원이 아닌 true는 1, false는 0 로 인식해서 오류가 발생하는 화면을 본적이 있다.

뭐 어찌되었건 이런 경우가 있었다는 주저리 였습니다.ㅎㅎ

 

다시 돌아와서~

 

boxing과 unboxing

int와 Integer이야기를 하면 항상 빠지지않고, 어느글이든 적혀있는 내용입니다.

jdk1.5부터는 autoboxing, autoUnboxing이 들어가있구요 ^^

boxing 기본형을 참조형으로 바꿈 (Integer -> int) // 객체를 값으로
ex) Integer v1 = new Integer(10);
unboxing 참조형을 기본형으로 바꿈 (int -> Integer) // 값을 객체로
ex) int v2 = (int)v1;

 

autoBoxing/autoUnboxing

위 기능때문에 아래 내용들이 가능합니다.

int a = 10;
Integer b = new Integer(10);
Integer c = new Integer(10);if(a == b) true :: 비교대상중 하나라도 type(int)변수가 있으면 == 연산자는 값으로 비교한다.
if(b == c) false ==> 자료형으로 equals()를 통해 비교하여야한다

값비교
if(a == 10) :: true
if(b == 10) :: true
if(c == 10) :: true

 

사용 이유 (무조건은 아닙니다!!)

자바에서 모든 객체는 힙(HEAP)영역에 저장된다. 또한 int같은 변수들은 클래스 변수로 선언되어 인스턴스 안에 포함되거나 static으로 선언되지 않았다면 모두 스택(STACK)영역에 저장된다. 무조건은 아닙니다!!! >..< 선언위치에 따라 위 내용을 바뀔수도 있습니다.

힙영역에 저장된 데이터는 상대적으로 스택에서 불러올때보다 속도가 떨어진다. 

 

공부하려고 책도 보고, 여러이웃분들 글도보고 검색도 하면서 적었습니다.

잘못된 내용이 있거나, 더 보태서 알면 좋을내용 댓글로 공유해주시면 정말 큰 도움이 되겠습니다.