본문 바로가기
IT Programming/Java

[JAVA] 10. int 와 Integer ? / 그리고 WrapperClass

by Euniieunii 2023. 4. 12.
int 와 Integer 는 비슷하지만 완전히 다른 영역

int와 integer 를 처음에는 무엇이 다른지도 모르고 예제를 볼때 그저 끼워 맞추듯 사용하고는 했는데 이것이 완전히 다른 기능을 하는 존재라는 것을 최근에야 이해를 했다.

우선, 쉽게 한줄로 요약을 하자면..

int변수의 타입(자료형) , Integer객체로 다루기 위한 클래스 

1.  int

int : 변수의 타입(data type = 자료형) 이다.

  • 변수 : 값을 저장할 수있는 메모리상의 공간
  • 자료형: ‘data의 type에 따라 값이 저장될 공간의 크기와 저장 형식을 정의한 것'
  • 산술연산이 가능하다.
Q. 자료형이 정확히 무엇인지 잘 모르겠어요

앞서 정의한 그대로 data의 type에 따라 값이 저장될 공간의 크기와 저장 형식 이지만, 직접 코드를 보며 이해하는게 가장 쉽다.

int a = 10;
double b = 3.14;

이 코드에서 a 는 변수명, 10은 변수의 값, 그리고 int는 이 변수가 어떤 타입의 변수를 나타내는 것인지 정해주는 데이터 타입, 자료형이다.


2.  Integer

integer : int의 래퍼클래스(기본형을 객체로 다루기 위해 사용하는 클래스)

  • 매개변수로 객체를 필요로 할 때
  • 기본형 값이 아닌 객체로 저장해야할 때
  • 객체 간 비교가 필요할 때
Q. 레퍼클래스란..?
A. 기본 자료타입(primitive type)을 객체로 다루기 위해서 사용하는 클래스

< Wrapper Class >

3. Wrapper Class 래퍼클래스

그렇다면 왜 래퍼클래스를 사용해야 할까?

크게 5가지로 볼 수 있다.

 

1. 프레임 워크의 데이터 구조는 기본 타입이 아닌 객체만 저장하기 때문에 Wrapper Class를 사용하여 자동 방식과 언방식이 일어 난다.

2. 기본 데이터 타입을 Object로 변환이 가능하고 이로인한 null값이 처리가 가능하다.

3. 멀티스레딩에서 동기화를 지원하려면 객체를 필요로 한다.

4. 제네릭 타입 사용: 제네릭에서는 기본 데이터 타입을 직접 사용을 할 수 없지만, 래퍼클래스를 사용하면 기본 데이터 타입을 제네릭 타입으로 사용이 가능하다.

다음은 제네릭에서 래퍼클래스를 다루는 예시이다.

import java.util.ArrayList;

public class WrapperExample {

    public static void main(String[] args) {
    	//ArrayList를 사용하여 Integer 객체를 저장
        ArrayList<Integer> numList = new ArrayList<Integer>();
        numList.add(10);
        numList.add(20);
        numList.add(30);

        int sum = sumList(numList);
        System.out.println("sum: " + sum);
    }

    public static int sumList(ArrayList<Integer> list) {
        int sum = 0;
        for (Integer num : list) {
            sum += num;
        }
        return sum;
    }
}

제네릭을 사용하면 ArrayList에 저장된 요소들의 타입을 지정할 수 있으며, 이를 통해 타입 안정성(type safety)을 보장할 수 있다.  또한 sumList() 메소드에서는 제네릭을 사용하여 ArrayList<Integer> 타입의 매개변수를 받으며, 이를 통해 Integer 객체의 합을 구할 수 있다.

: 위의 예시같은 경우에는 Integer를 사용하였지만 Boolean, Character, Byte, Short, Long, Float, Double.... 등등 다른 래퍼클래스도동일하게 제네릭으로 사용이 가능하다.

 

5. 값의 변환과 비교가 가능하다. 래퍼클래스는 값을 변경할 수 있는 비교 메소드를 제공하기 떄문에 기본 데이터타입의 값이 변경되는 것을 방지하고, 값을 비교할 수 있다.

다음은 int 와 Integer 값의 변환과 비교의 예시코드이다.

// int 값을 Integer 객체로 변환하기
int num = 10;
Integer obj = Integer.valueOf(num);

// Integer 객체를 int 값으로 변환하기
Integer obj = Integer.valueOf(10);
int num = obj.intValue();
// Integer 객체 비교하기
Integer a = 10;
Integer b = 20;
if (a.equals(b)) {
  System.out.println("a와 b는 같습니다.");
} else {
  System.out.println("a와 b는 다릅니다.");
}

// int 값 비교하기
int num1 = 10;
int num2 = 20;
if (num1 == num2) {
  System.out.println("num1과 num2는 같습니다.");
} else {
  System.out.println("num1과 num2는 다릅니다.");
}

 

5. Boxing / UnBoxing 박싱, 언박싱

박싱 Boxing : 기본 자료형(primitive type)의 값을 해당하는 래퍼 클래스(wrapper class)의 객체로 변환하는 과정.
//박싱하는 과정
//기본 자료형 -> 래퍼클래스의 객체 생성 
int num = 10; // 기본 자료형
Integer obj = Integer.valueOf(num); // 래퍼 클래스의 객체 생성
언박싱 UnBoxing : 래퍼 클래스(wrapper class)의 객체를 해당하는 기본 자료형(primitive type)의 값으로 변환하는 과정.
//언박싱하는 과정
//래퍼클래스의 객체 -> 기본 자료형으로 변환
Integer obj = Integer.valueOf(10); // 래퍼 클래스의 객체 생성
int num = obj.intValue(); // 기본 자료형으로의 변환

< 박싱과 언박싱 >

오토박싱 Auto-Boxing 과 오토언박싱 Auto-UnBoxing : 박싱과 언박싱을 함께 사용하는 경우. (자동변환)
//오토박싱
int num = 10; // 기본 자료형
Integer obj = num; // 오토박싱

//obj는 num의 값을 가지게 되고 래퍼 클래스 객체로서 여러 가지 메소드를 호출할 수 있게 된다.

//오토언박싱
Integer obj = 20; // 래퍼 클래스의 객체
int num = obj; // 오토언박싱

//num은 obj 객체와 같은 값을 가지며, 기본 자료형으로서 여러 가지 연산수행이 가능해진다.

마지막으로 int 와 Integer 의 차이점을 간단하게 표로 정리한 것이다.

                                                 int                           vs                               Integer
산술 연산 가능 Unboxing하지 않으면 산술 연산 불가
null로 초기화 불가 null값 처리 가능
자료형 래퍼클래스
메소드를 가지지 못함 객체로 저장

 

댓글