hoon's bLog

Java Wrapper class 자바 래퍼클래스 본문

IT/Java

Java Wrapper class 자바 래퍼클래스

개발한기발자 2021. 1. 6. 17:46
반응형

안녕하세요:)

이번 포스팅에서는 Wrapper 클래스를 다뤄보도록 하겠습니다.

Wrapper 클래스란?

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

대표적으로 기본 타입은 char, int, float, double, boolean 등이 있고,

참조 타입은 class, interface 등이 있는데 프로그래밍을 하다 보면,

기본 타입의 데이터를 객체로 표현해야 하는 경우가 종종 있습니다.

 

이럴 때에 기본 자료 타입을 객체로 다루기 위해서 사용하는 클래스들을, 래퍼 클래스라고 합니다.

자바는 모든 기본타입(primitive type)은 값을 갖는 객체를 생성할 수 있습니다.

이런 객체를 포장 객체라고도 하는데 그 이유는 기본 타입의 값을 내부에 두고 포장하기 때문입니다.

래퍼 클래스로 감싸고 있는 기본 타입 값은 외부에서 변경할 수 없습니다.

만약 값을 변경하고 싶다면 새로운 포장 객체를 만들어야 합니다.

Wrapper 클래스의 종류

문자열 -> 기본형 래퍼클래스(wrapper class)
byte Byte
char Character
int Integer
float Float
double Double
boolean Boolean
long Long
short Short

래퍼 클래스는 java.lang 패키지에 포함되어 있는데,

다음과 같이 기본 타입에 대응되는 래퍼 클래스들이 있습니다.

char타입과 int타입이 각각 Character와 Integer의 래퍼 클래스를 가지고 있고,

나머지는 기본 타입의 첫 글자를 대문자로 바꾼 이름을 가지고 있습니다.

그렇다면 Wrapper 클래스는 언제 사용되느냐?

기본형(primitive type) 변수도 때로는 객체로 다루어져야 하는 경우가 있습니다.

- 매개변수로 객체가 요구 될때.

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

- 객체 간의 비교가 필요할 때. 등등

이럴 때 사용이 되겠습니다 ㅎㅎㅎㅎ

정리하자면 다음과 같이 되겠습니다.

문자열 -> 기본형 문자열 -> wrapper 클래스
byte b = Byte.parseByte("100"); Byte b = Byte.valueOf("100");
short s = Sort.parseShort("100"); Short s = Short.valueOf("100");
int i = Integer.parseInt("100"); Integer i = Integer.valueOf("100");
long l = Long.parseLong("100"); Long l = Long.valueOf("100");
float f = Float.parseFloat("3.14"); Float f = Float.valueOf("3.14");
double d = Double.parseDouble("3.14"); Double d = Double.valueOf("3.14");

그러면 예제를 통해 Wrpper 클래스를 사용해보도록 하겠습니다.

public class Wrapper_Ex {
    public static void main(String[] args)  {
        String str = "10";
        String str2 = "10.5";
        String str3 = "true";
        
        byte b = Byte.parseByte(str);
        int i = Integer.parseInt(str);
        short s = Short.parseShort(str);
        long l = Long.parseLong(str);
        float f = Float.parseFloat(str2);
        double d = Double.parseDouble(str2);
        boolean bool = Boolean.parseBoolean(str3);
		
        System.out.println("문자열 byte값 변환 : "+b);
        System.out.println("문자열 int값 변환 : "+i);
        System.out.println("문자열 short값 변환 : "+s);
        System.out.println("문자열 long값 변환 : "+l);
        System.out.println("문자열 float값 변환 : "+f);
        System.out.println("문자열 double값 변환 : "+d);
        System.out.println("문자열 boolean값 변환 : "+bool);
    }
}

실행결과

래퍼 클래스의 주요 용도는 기본 타입의 값을 박싱 해서 포장 객체로 만드는 것이지만,

문자열을 기본 타입 값으로 변환할 때에도 사용됩니다.

대부분의 래퍼 클래스에는 parse + 기본 타입명으로 되어있는 정적 메서드가 있습니다.

이 메서드는 문자열을 매개 값으로 받아 기본 타입 값으로 변환합니다.

값 비교

public class Wrapper_Ex {
    public static void main(String[] args)  {
        Integer num = new Integer(10); //래퍼 클래스1
        Integer num2 = new Integer(10); //래퍼 클래스2
        int i = 10; //기본타입
		 
        System.out.println("래퍼클래스 == 기본타입 : "+(num == i)); //true
        System.out.println("래퍼클래스.equals(기본타입) : "+num.equals(i)); //true
        System.out.println("래퍼클래스 == 래퍼클래스 : "+(num == num2)); //false
        System.out.println("래퍼클래스.equals(래퍼클래스) : "+num.equals(num2)); //true
    }
}

실행결과

래퍼 객체는 내부의 값을 비교하기 위해 == 연산자를 사용할 수 없습니다.

이 연산자는 내부의 값을 비교하는 것이 아니라 래퍼 객체의 참조 주소를 비교하기 때문입니다.

비교 대상인 래퍼는 객체이므로 서로의 참조 주소가 다릅니다.

 

객체끼리의 비교를 하려면 내부의 값만 얻어 비교해야 하기에 equals를 사용해야 합니다.

래퍼 클래스와 기본자료형과의 비교는 == 연산과 equals연산 모두 가능합니다.

그 이유는 컴파일러가 자동으로 오토박싱과 언박싱을 해주기 때문입니다.

이렇게 해서 Wrapper 클래스까지 알아보았습니다.

다음 시간엔 제네릭에 대해서 알아보도록 하겠습니다!

 

출처 : 자바의 정석 3rd Edition 내용 정리

728x90
반응형