Java

[Java] int와 Integer의 차이

Empty Brain 2022. 12. 19. 20:42

나다.

 

이 글이 뭐하는 글이냐면

 

여러분은 int와 Integer에 대해 알고있는가?

무릇 int라 함은 Java를 배울 때 가장 먼저 만날 수 있는 정수형 변수를 이야기한다.

 

long도 정수형인데요? 라고 말한다면 맞는 말이다.

 

쳐맞는 말

나는 int형에 대해 말하는 중이니 조용히하기 바란다.

어차피 다른 애들도 int , Integer의 관계와 비슷하다.

 

 

먼저 간단한 표로 int와 Integer를 알아보자.

이름 int Integer
자료형 기본 자료형(원시 타입) 참조 자료형(참조 타입)
Null 허용 ㄴㄴ 안됨.(0은 null 아님.) 허용 십가능
연산 허용 십가능 unboxing 하기 전에는 안됨.
이 새X 뭐임? 객체 아님. 객체임.(Class임.)

 

int는

먼저 int는 원시 타입으로 정수를 저장하면 정수 그 자체의 값이 된다.

예를 들어,

int 정수임 = 123;

 

다음 선언의 동작을 본다면 정수형 타입의 "정수임" 이라는 이름을 가진 메모리 공간이 JVM의 스택 영역에 생성된다.

그리고 123이라는 값이 들어간다.

메모리 공간 자체에 실제 데이터인 123이 저장되는 것이다.

 

 

다음으로 null을 집어넣을 수 없다.

가끔 0이면 아무것도 없다는 뜻이니까 null 아닌가요? 라는 말을 하는 사람이 있는데.

null null로 만들어 줄 수 있으니 주의하기 바란다.

0과 null은 다르다.

이건 마치 다 먹은 음료수캔을 손에 쥐고 있는 것과 아무것도 안쥐고 있는 것의 차이다.

음료수를 다 먹었어도 손에 캔을 쥐고있다면 뭐라도 있는 것 아닌가. (0의 상태)

근데 손에 아무것도 없으면 그게 아무것도 없는거다. (null의 상태)

 

다음으로 연산이 허용된다.

int a = 1;
int b = 1;
int 귀요미 = a + b;

//귀요미 == 2 <- true

다음과 같은 사칙연산이 허용된다.

"어? Integer로 더해도 잘 더해지던데요 돌팔이 새X야 ㅋㅋ"

라고 말한다면 그것은 나 같은 빡대가리들이 편하라고 Java가 지원하는 autoBoxing과 autoUnboxing에 의한 것이다.

이건 나중에 설명하겠다. 그냥 자동으로 형변환 해주는거라고 생각하셈.

 

마지막으로 원시타입으로 객체가 아닌 메모리영역에 저장된 데이터 그 자체다.

 

Integer는

 

위의 표에서 Integer는 객체라 했다.

먼저 Integer의 선언을 보자.

Integer 정수임 = new Integer(123);
//또는
Integer 정수임 = Integer.valueOf(123);
//또는
Integer 정수임 = 123; <- auto boxing 때문에 됨.

 

위에 다 같은거다.

어쨋든 Integer는 참조 타입으로 객체의 주소를 저장하게 된다.

실제 Integer 타입의 실제 객체는 JVM의 힙 영역에 생성, 저장되며 참조 타입 변수인 "정수임"은 실제 객체의 주소를

JVM의 스택 영역에 저장한다. 그리고 객체가 사용되면 참조 타입 변수에 저장된 객체의 주소로 불러와 사용하는 것이다.

 

비유하자면 배달의민족을 끼고 주문한 음식을 받는 내 입장과 비슷한 것이다.

청룡각 배달의민족 = new 청룡각("짜장면");
System.out.println("나 배달시킴 =" + 배달의민족);

 

  1. 짜장면 한 그릇 가와보이소. (배달의민족 호출)
  2. "배달의 민족"은 사용자가 선택한 "청룡각"으로 주문을 중계함.(스택 영역에 저장된 "주소"로 짜장면 받아오라고 라이더 보냄.)
  3. 라이더가 "청룡각" 주소로 가서 "짜장면" 받아옴. (힙 영역에 실제 객체의 인스턴스(짜장면) 가져옴.)
  4. 호출한 "배달의민족"(참조 타입 변수)으로인해 "청룡각"(객체 주소)에서 가져온 "짜장면"(객체 인스턴스)이 도착.
  5. 꺼억

개병X같은 비유이기는 하나 대충 이런 방식이다 라는 식으로 이해하면 될 듯하다.

 

다음으로 null을 허용한다.

Integer 진짜됨 = null;

null을 허용하기 때문에 sql과 연계된 처리에 유리한 장점이 있다고 하는데 그냥 notNull 박아버리고 편하게 하셈 ㅋㅋ.

사실 null 허용으로 인한 장,단점에 대해 설명하고싶으나 딱히 떠오르지 않음.

 

다음으로 연산이 불가능하다.

 

원론적으로 연산이 불가능한 것이 맞다.

그러나 나같은 빡대가리들을 위해 Java에서 지원하는 autoBoxing과 unboxing으로 인해 연산이 가능하다.

 

맞다.  야매로 연산시킨다는 뜻이다.

 

먼저 boxing과 unboxing은

int -> Integer (boxing)
Integer -> int (unboxing)

인데

Integet a = Integer.valueOf(1);
Integer b = Integer.valueOf(1);

Integer 귀요미 = a + b;

위의 식을 보면 Integer의 합연산을 요구 하고있다.

 

이런 경우 Java는

int x = Integer.parseInt(a); (unboxing)
int y = Integer.parseInt(b); (unboxing)

int r = x + y;

귀요미 = Integer.valueOf(r); (boxing)

과 같은 과정을 스스로 수행하는 것이다.

연산이 가능한 원시타입으로 unboxing 후 연산을 진행하고 boxing하여 저장해버린다.

(진짜 저렇게 한다는게 아니라 저렇게 변환해서 연산하는 과정을 스스로 한다는 뜻임.)

물론 unboxing 없이 그냥 Integer끼리 연산하는 것은 안된다.

 

마지막으로 객체다.

사용할 때는 객체의 인스턴스를 가져와 쓰는거지만 위에 설명했으니 생략한다.위에 청룡각 읽어보셈.

 

끝임.

 

혹여나 글에 잘못 된 정보가 있더라도 그건 내가 허접이라 그런 것이니 너그럽게 용서하시기 바란다.

좋은거 있으면 나한테도 알려주신다면 감사하겠다.

좋은건 나눠쓰라는 말도 있지않은가.

 

그럼 컴파일 오류 없는 개발하시길..  :)

'Java' 카테고리의 다른 글

[Java] HashMap이란 무엇인가.  (5) 2023.01.01
[Java] String이란 무엇인가.  (8) 2022.12.31
[Java] List<Integer> <-> int[] 변환  (4) 2022.12.18
[JAVA] 다이아몬드 연산자가 뭐임?  (1) 2022.12.17