본문 바로가기
딥다이브

객체화를 위한 래퍼(Wrapper) 클래스

by 보보트레인 2023. 6. 16.

사건의 발단

알고리즘 문제를 풀다가 문자열에 담기위해 char를 String으로 변환해주는 작업이 필요했다.

코드

밑줄의 내용처럼 Character.toString(char a)형식의 매서드를 사용했다.

반면에 배열같은 경우에는 Arrays.toString(array)형식의 매서드를 사용했다.

코드

toString을 쓸 때,

왜 char은 char.toString(char a)으로 쓰면안되고 Character를 써야하는지,

왜 배열은 그냥 Arrays.toString(array)으로 써도되는지 궁금했다. 그 이유를 자세히 알아보자.

래퍼클래스란?

자바에서 기본 타입의 데이터를 객체로 표현해야 하는 경우 래퍼 클래스를 사용한다.

 

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

기본 타입은 정수, 실수, 문자, 논리 리터럴을 저장하는 타입이다.
참조 타입은 배열, 열거, 클래스, 인터페이스 등 객체의 위치를 참조하는 타입니다.

 

기본 타입 : byte, short, char, int, long, float, double, boolean
참조 타입 : class, interface, Array, String...

 

래퍼 클래스 8개의 기본 타입에 해당하는 데이터를 객체로 표현하기 위해 포장해주는 클래스라고 한다.
각각의 타입에 해당하는 데이터를 인수로 전달받아 해당 값을 가지는 객체로 만들어준다.

 

래퍼클래스 정리표
래퍼 클래스 구조도

2. 박싱과 언박싱

Wrapper는 한글로 포장하다 라는 뜻이 있다. 즉 boxing과 동의어다. 

그 반대는 unboxing으로 나타낸다.

박싱과 언박싱 그림설명

박싱/언박싱 예시코드는 다음과 같다.

public class Wrapper_Ex {
    public static void main(String[] args)  {
        Integer num = new Integer(17); // 박싱
        int n = num.intValue(); //언박싱
        System.out.println(n);
    }
}


+@ 자동 박싱과 자동 언박싱
기본타입 값을 직접 박싱, 언박싱하지 않아도 자동적으로 박싱과 언박싱이 일어나는 경우가 있다. 
자동 박싱의 포장 클래스 타입에 기본값이 대입될 경우에 발생한다. 

public class Wrapper_Ex {
    public static void main(String[] args)  {
        Integer num = new Integer(17); // 박싱
        int n = num.intValue(); //언박싱
        System.out.println(n);
    }
}

 

3. 래퍼클래스 간의 비교

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연산 모두 가능하다.

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

 

 

 

 

 

 

equals 연산은 다음 글을 참고해주세요

https://iron-mentalman.tistory.com/entry/StringBuffer%EA%B0%80-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%B0%98%ED%99%98%EC%9D%84-%ED%95%B4%EC%95%BC%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0equals-%EA%B9%8A%EA%B2%8C-%ED%8C%8C%ED%97%A4%EC%B9%98%EA%B8%B0

 

StringBuffer가 문자열 반환을 해야하는 이유(.equals() 깊게 파헤치기)

사건의 발단은 이렇다. StringBuffer를 사용하여 reverse()메서드로 문자열의 순서를 뒤집고 reversed라는 문자열에 값을 담고자 하는데, 맨 뒤에 .toString();을 왜 붙혀야 하는지 의문이 생겼다. (분명 같

iron-mentalman.tistory.com

 

 

최종 응용 ( 완벽히 이해하기 ) - 자체제작 문제

문제 :

char c ='c';

String s = "s"; 

 

다음의 char과 String의 값을 대문자로 변경하고자 한다. 

알맞은 메서드를 찾아서 기입하라.

 

답 :

Character.toUpperCase(c);

s.toUpperCase(); 

 

해설 :

.toUpperCase()라는 매서드를 사용하기 위해선 기본타입의 데이터로는 불가능하다. ( 객체화가 반드시 필요 )

char은 기본타입의 데이터이므로 래퍼클래스로의 변경을 통해 객체로 만들어야 한다.

따라서 Character를 사용하여 .toUpperCase()에 값을 담아 변환했다.

 

반면에 String같은 경우에는 그 자체로 이미 래퍼클래스이다.

따로 래퍼클래스의 변환없이 .toUpperCase()의 사용이 가능하다.

따라서 s.toUpperCase()로 쉽게 변환할 수 있다.

 

 

반응형