[Java]int 와 Integer 의 차이

Lia·2022년 10월 13일
1

☕️ Java

목록 보기
2/5
post-custom-banner

🙋🏻‍♀️ int 와 Integer 의 차이에 대해 알아보자:)

일단 , int란 뭘까?

int는 변수의 타입(data type=자료형)이다.
자료형은 기본형(primitive type)과 참조형(referece type)으로 나뉘는데, int 는 이 중 기본형에 속한다.

😲 자료형이 뭔데❓
data의 type에 따라 값이 저장될 공간의 크기와 저장 형식을 정의한 것

😲 그나저나 여러개의 정수형 타입 중 int가 기본형 타입인 이유는❓
정수형 타입은 리터럴 접미사가 붙지않으면 int타입으로 간주한다.왜 그럴까?
JVM의 피연산자 스택(operand stack)이 피연산자를 4byte단위로 저장하기 때문에 4byte인 int자료형을 사용하면 바로 연산을 하지만4byte보다 작은 자료형(byte,short)로 값을 계산하면 4byte로 다시한번 변환하는 연산이 생기게 되므로, 연산을 수행할때 int보다 작은 자료형을 사용하면 더 비효율적인 것이다. 만약, CPU연산보다 메모리를 더 절약하는게 중요한 프로그램이라면 byte,short를 사용해도 된다.

  • 피연산자 스택은 어디에 있나?
    JVM의 구조에서 스택은 스택 프레임(Stack Frame)이라는 구조체를 저장하는 스택으로, JVM은 오직 JVM 스택에 스택 프레임을 추가하고(push) 제거하는(pop) 동작만 수행한다.
    JVM 내에서 메서드가 수행될 때마다 하나의 스택 프레임이 생성되어 해당 스레드의 JVM 스택에 추가되고 메서드가 종료되면 스택 프레임이 제거된다. 이때, 각 스택 프레임은 지역 변수 배열(Local Variable Array), 피연산자 스택(Operand Stack), 현재 실행 중인 메서드가 속한 클래스의 런타임 상수 풀에 대한 레퍼런스를 갖는다. 지역 변수 배열, 피연산자 스택의 크기는 컴파일 시에 결정되기 때문에 스택 프레임의 크기도 메서드에 따라 크기가 고정된다.

그럼, Integer는 무엇일까?

 Integer는 int의 wrapper class라고 할 수 있다.
wrapper클래스는 기본형을 객체로 다루기 위해 사용하는 클래스들을 의미한다.

😲 기본형을 객체로 다룬다는 것은 어느 경우를 말하는걸까❓

  • 매개변수로 객체를 필요로 할 때
  • 기본형 값이 아닌 객체로 저장해야할 때
  • 객체 간 비교가 필요할 때
    이와 같이 모든 기본형은 래퍼클래스를 생성할 수 있다.

그럼 int와 Integer는 구체적으로 어떻게 다른걸까?

int : 자료형(primitive type)

  • 산술 연산 가능함
  • null로 초기화 불가
  • int의 정수 값을 다른 기본으로 변환할 수 없음
  • 정수 값을 저장하는 데 4바이트가 필요

Integer : 래퍼 클래스 (Wrapper class)

  • Unboxing하지 않을 시 산술 연산 불가능함
  • null값 처리 가능
  • Integer 클래스의 toBinaryString, toOctalString, toHexString 함수를 사용하면 각각 2진수,8진수 16진수로 변환할 수 있음(Integer에 저장된 정수 값을 직접 변환할 수 있음)

😲 null과 0

두개의 차이를 사진으로 약간은 이해했으나, 구체적으로 null과 0은 어떤 차이점이 있고, null이 필요한 경우를 찾아봐야겠다!

Boxing과 UnBoxing


🙋🏻‍♀️ wrapper 클래스의 인스턴스, 즉 포장 객체는 내부의 값을 비교하기 위해 ==와 !=를 사용할 수 없다.
동등 연산자(==)를 사용하게 되면, 두 인스턴스의 값을 비교하는 것이 아니라 두 인스턴스의 주소값을 비교하게 되는데, 포장 객체는 내부 값이 아니라 참조를 비교하기 때문이다.이럴 땐 == 말고 equals() 메소드를 사용하면 된다.

그렇다면 언제 int 를 사용하고 언제 Integer 를 사용 하면 될까?

int는 차지하는 공간이 4byte에 불가하고, wrapper class처럼 메소드도 가질 수 없으며, 오직 데이터만 저장할 수 있다.
이와 같이 int는 정수 값을 메모리에 저장하는 단일 목적으로만 사용된다.

Integer는 int와 달리 null값 처리가 필요하거나, 데이터를 wrapper(기본형을 객체로 다룸)할 경우에 사용할 수 있다.

  • wrapper class를 사용하는 또 다른 이유
  1. 래퍼 클래스는 기본 데이터 타입을 오브젝트(Object)로 변환할 수 있다.

    메소드에 전달된 파라미터를 수정하려는 경우 오브젝트가 필요하다.

  2. 거의 모든 패키지의 클래스들은 제네릭 타입을 파라미터로 받는다. 제네릭 타입은 래퍼 클래스만 들어갈 수 있다.

  3. 컬렉션 프레임 워크의 데이터 구조는 기본 타입이 아닌 객체만 저장할 수 있으며, 래퍼 클래스를 사용해 자동 박싱과 언박싱이 일어난다.

  4. 래퍼 클래스는 기본 타입과 다르게 null 값을 저장할 수 있다.

    웹 서버의 경우 클라이언트에서 null 값이 왔을 때 기본 타입이면 예외가 발생한다.

📍 Reference

https://slenderankle.tistory.com/151
https://blog.naver.com/msk9711/222367898285
[Java] Integer와 int의 차이
[JAVA] Int, Integer 너네 다른게 뭐니?
int vs Integer Java - Javatpoint


멘토님이 int 와 Integer 의 차이를 물어보시길래 , 너무나 당당하게 "같은거 아닌가요?" 라고 대답했다🫢
멘토님이 다음 멘토링까지 알아오라고 미션을 주셨는데 정리하고 나니 같은거 라고 당당히 대답했던 내 자신이 아주 잠깐 부끄러웠지만, 이번 기회에 확실히 알았으니 오히려 좋다 ! 모르는것에 대해 어물쩡 넘어가지말고 알아보는 습관을 가지자.

profile
꺾이지않기ᕙ༼*◕_◕*༽ᕤ
post-custom-banner