본문 바로가기
💻 컴퓨터 시스템

int와 Integer 차이 (Primitive 자료형과 Wrapper 클래스 관계)

by 비타민찌 2022. 4. 15.
728x90

int 와 Integer 차이

(Primitive 자료형 - Wrapper 클래스 관계)

 

 

1. Wrapper 클래스

자바의 자료형은 크게 기본 타입(primitive type)과 참조 타입(reference type)으로 나뉜다.

기본 타입은 byte, char, short, int, long, float, double, boolean 등이 있고

참조 타입은 class, interface 등이 있는데,

프로그래밍을 하다 보면 기본 타입의 데이터를 객체로 표현해야 하는 경우가 종종 있다.

나의 경우 int형 변수에 if == null 넣으려다가 int Integer 차이를 찾게 됐다..

이때 기본 자료타입(primitive type)을 객체로 다루기 위해서 사용하는 클래스들을

래퍼 클래스(wrapper class)라고 한다.

래퍼 클래스는 java.lang 패키지에 포함되어 있으며, 아래와 같이 기본 타입에 대응되는 래퍼 클래스들이 있다.

2. int Integer 차이

 

1) int (primitive type)

int는 '변수의 타입(data type)'이다.

변수(variable)는 '값을 저장할 수 있는 메모리 상의 공간'을 의미한다.

int a = 1;
 

에서 a가 변수(변수명)이고

그 앞에 적힌 int, 변수의 형을 지정해주고 있는 것이

변수의 타입(data type,자료형 )이다.

즉 자료형은 data의 type에 따라 값이 저장될 공간의 크기와 저장 형식을 정의한 것이다.

 

이 자료형은 기본형(primitive type)과 참조형(referece type)으로 나뉘는데

int 는 이 중 기본형에 속한다. (boolean, char, byte 등도 기본형.)

 

 

2) Integer (wrapper class)

기본형을 표현해야 하는 경우가 있다.

- 매개변수로 객체를 필요로 할 때

- 기본형 값이 아닌 객체로 저장해야할 때

- 객체 간 비교가 필요할 때

(이렇게 기본형을 객체로 다루기 위해 사용하는) 클래스들을 래퍼 클래스(wrapper class)라고 한다.

 

 

3. int와 Integer간의 변환 (Boxing, Unboxing)

래퍼 클래스(Wrapper class)는 산술 연산을 위해 정의된 클래스가 아니기 때문에

인스턴스에 저장된 값을 변경할 수 없다.

단지 값을 참조하기 위해 새로운 인스턴스를 생성하고, 생성된 인스턴스의 값만을 참조할 수 있다.

위의 그림과 같이 기본 타입의 데이터를 wrapper 클래스의 인스턴스로 변환하는 과정을 박싱(Boxing)이라고 하고, 래퍼 클래스의 인스턴스에 저장된 값을 다시 기본 타입의 데이터로 꺼내는 과정을 언박싱(UnBoxing)이라고 한다.

래퍼 클래스인 Interger 클래스와 Character 클래스에는 각각 언박싱을 위한 valueOf와 intValue 메서드가 있다.

wrapper 클래스의 인스턴스, 즉 포장 객체는 내부의 값을 비교하기 위해 ==와 !=를 사용할 수 없다.

동등 연산자(==)를 사용하게 되면, 두 인스턴스의 값을 비교하는 것이 아니라 두 인스턴스의 주소값을 비교하게 되는데, 포장 객체는 내부 값이 아니라 참조를 비교하기 때문이다.이럴 땐 == 말고 equals() 메소드를 사용하면 된다.

 

그러나 예외로..! 자바 명세에 따르면

박싱된 값이 boolean(true, false), char(\u0000~\u007f), byte short int(-128 ~ 127) 라면

 

==와!= 연산자로 내부의 값을 바로 비교할 수 있다.

하지만 포장 객체에 어떤 값이 들어갈지 확실하지 않는 상황이라면 동등연산자는 사용하지 않는 편이 좋겠다.

 

사용 예제

public static void main(String[] args) {
        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
    }
 

 

3. 왜 Wrapper 클래스를 쓰지?🤔

기본 타입이 아닌 래퍼 클래스를 사용하는 이유를 찾아봤다. 다음과 같이 4가지로 정리할 수 있을 것 같다.

 

1) 래퍼 클래스는 기본 데이터 타입을 오브젝트(Object)로 변환할 수 있다.

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

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

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

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

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

 

 

 

참고 : http://www.tcpschool.com/java/java_api_wrapper , https://blog.naver.com/ghdalswl77/222699907054

728x90

댓글