본문 바로가기

java

[210430] java wrapper class

.

 

travel2develop.tistory.com/33

 

[210430] java 기본 자료형

. java wrapper에 대해 정리하다가 기본 자료형에 관련된 내용을 함께 정리하게 되었는데, 내용이 길어져서 글을 따로 올리게 되었다. docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html 의 내용..

travel2develop.tistory.com

 

이전 글에서 자바의 기본 자료형에 대해서 정리했다. 기본 자료형은 객체가 아니다. 그런데, 프로그래밍을 하다 보면 기본 자료형을 객체로 사용해야 하는 때가 있다. 메소드의 인수로 객체 타입만이 요구되거나, List 같은 자료형에 값을 저장해야 할 때가 그렇다.

 

        int[] arr = new int[10];
        
        // 아래 코드는 int를 그대로 사용할 수 없어서 컴파일 에러가 발생합니다. 
        Arrays.sort(arr, new Comparator<int>());
        List<int> list = new ArrayList<>();

 

이때 Wrapper class를 사용해서 기본 데이터 타입을 객체로 변환할 수 있다. 

 

 

Wrapper class


래퍼 클래스를 사용해서 자바 기본 데이터 타입으로 선언된 데이터를 객체로 저장할 수 있다. 기본 타입에 대응해서 사용할 수 있는 래퍼 클래스는 아래와 같다. 해당 클래스는 모두 java.lang 클래스에 포함되어 있다. 

primitive type wrapper class
byte Byte
short Short
int Integer
long Long
float Float
double Double
boolean Boolean
char Char

 

이때 기본 데이터 타입을 래퍼 클래스로 감싸는 것을 boxing, 반대로 래퍼 클래스를 기본 데이터 타입으로 바꾸는 것을 unboxing이라고 한다. JDK 1.5부터는 Autoboxing, Autounboxing을 지원하여 자동으로 박싱과 언박싱을 처리해준다. 

        // autoboxing
        Integer integer = 10;
        System.out.println("print integer : " + integer);

        // autounboxing
        int i = integer;
        System.out.println("print int : " + i);

예제처럼 Integer 형의 변수 integer에 기본 데이터 타입 데이터인 10을 저장하거나, 그 integer 변수를 int 형 변수에 다시 저장하는 것이 가능하다. 오토박싱은 아래와 같은 상황에서 사용된다. 

 

  • 메소드의 매개변수로 래퍼 클래스가 넘겨져야 할 때 
  • 래퍼 변수에 값을 할당할 때 

 

우리가 위와 같은 코드를 실행하면, 자바 컴파일러는 내부적으로 다음과 같은 동작을 수행한다. 

        // autoboxing
        Integer integer = Integer.valueOf(10);
        System.out.println("print integer : " + integer);

        // autounboxing
        int i = integer.intValue();
        System.out.println("print int : " + i);

int를 Integer 자료형으로 바꿀 때 Integer.valueOf()를 사용하였고, Integer를 int 자료형으로 바꿀 때 Integer.intValue() 메소드를 사용한 것을 확인할 수 있다. 이러한 메소드는 java.lang.Integer 안에 static으로 선언되어 있다. 

 

 

래퍼 클래스를 사용해서, 글을 시작할 떄 예시로 든 코드도 수정할 수 있다. 

        // Integer 형태로 배열을 선언하고 Comparator를 생성한다.
        Integer[] arr = {5, 3, 2, 1, 4};

        Arrays.sort(arr, new Comparator<Integer>(){

            @Override
            public int compare(Integer o1, Integer o2) {
                return o1 - o2;
            }
        });

        System.out.println("1. 정렬된 Integer 배열 출력");
        for(int i : arr){
            System.out.println(i);
        }
        System.out.println(" ");

        // list에 int 대신 객체 형태인 Integer를 저장한다.
        List<Integer> list = new ArrayList<>();

        list.add(1);
        list.add(3);
        list.add(5);

        System.out.println("2. list 출력");
        for(int i : list){
            System.out.println(i);
        }

 

- 실행 결과 

 

 

 

java.lang.Integer


Integer.class의 소스 코드를 확인해보았다. 

클래스 내부에 value 변수가 있다. 생성자를 통해 Integer를 생성할 떄 받아온 값을 value에 저장하는 것을 확인할 수 있다. 래퍼는 내부에 데이터 값을 감싸고 있는 하나의 객체이다. 

 

내부에 여러 static 필드와 메소드가 있었다. 이 중 유용하게 주로 쓰이는 것들을 정리하고자 한다. 

 

 

 

Fields


pubilc static int MAX_VALUE  : int가 저장할 수 있는 최댓값을 저장하고 있다. 

public static int MAX_VALUE  : int가 저장할 수 있는 최솟값을 저장하고 있다. 

 

 

 

Method


public static String toString(int i) : i를 String 형태로 반환한다. 

public static toBinaryString(int i) : i를 2진수로 나타낸 String 형태로 반환한다. 

public static toOctalString(int i) : i를 8진수로 나타낸 String 형태로 반환한다. 

public static toHexString(int i) : i를 16진수로 나타낸 String 형태로 반환한다. 

public static int compare(int x, int y) :  x, y의 값을 비교한다. x가 더 작다면 -1, 같다면 0, 크다면 1을 반환한다. 

 

public static int parseInt(String s) throws NumberFormatException : 문자열 s를 int 형의 정수로 변환한다. String이 저장한 값이 변환 가능한 숫자가 아니라면 NumberFormatException이 발생한다. 

public static Integer valueOf(String s) throws NumberFormatException : 문자열 s를 Integer 객체 형의 정수로 변환한다. 

public static Integer valueOf(int i) : i를 그에 대응하는 값을 가진 Integer 객체로 변환한다. 

 

public int intValue() : 해당 Integer 객체에 저장된 데이터를 int 형으로 반환한다. 

public int doubleValue() : 해당 Integer 객체에 저장된 데이터를 double 형으로 반환한다. 

 

 

 

 

 

 

 

- 참고 자료

www.tcpschool.com/java/java_api_wrapper

jusungpark.tistory.com/17

docs.oracle.com/javase/tutorial/java/data/autoboxing.html