본문 바로가기
Language/Java

[Java] 자바기초 - Wrapper Class

by J4J 2020. 12. 13.
300x250
반응형

안녕하세요. J4J입니다.

 

이번 포스팅은 Wrapper Class에 대해 적어보는 시간을 가져보려고 합니다.

 

 

Wrapper Class란?

 

Wrapper Class라고 하는 것은 자료형에 속하는 타입들의 객체화라고 말할 수 있습니다.

 

우선 자료형에 속하는 것들이 무엇이 있을까요?

 

나열을 해보면 byte, short, int , long, float, double, char, boolean, String 등이 있습니다.

 ※ 자료형에 대해 더 자세히 알고 싶다면? [Java] 자바기초 - 자료형

 

그리고 이런 자료형들을 Wrapper Class로 표현하면 아래 표와 같이 표현할 수 있습니다.

 

자료형 Wrapper Class
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

 

 

어? String이 빠진 거 같은데요?

 

그 이유는 String은 이 자체가 Wrapper Class의 역할을 수행할 수 있기 때문입니다.

 

 

Wrapper Class 사용 이유

 

그럼 이런 자료형들을 굳이 객체화를 시키는 이유는 무엇일까요?

 

여러 이유들이 있겠지만 저는 그중 2가지에 대해 말해보려고 합니다.

 

첫 번째는 자료형에서 사용하지 못하는 다양한 기능들을 제공해줍니다.

 

사용될 수 있는 기능 중 자주 사용되는 것은 Promotion과 Casting으로 되지 않는 형 변환입니다.

 

다음 코드를 한번 봅시다.

 

package wrapper;

public class Transform {
	public static void main(String[] args) {
		String stringVal1 = "353";
		String stringVal2 = "154.23";
		
		int intVal = Integer.valueOf(stringVal1); // 자료형 = Wrapper Class 형태
		double doubleVal = Double.valueOf(stringVal2); // 자료형 = Wrapper Class 형태  
        	String stringVal3 = Integer.toString(intVal);
		String stringVal4 = intVal + "";
		
		System.out.println("intVal값: " + intVal);
		System.out.println("doubleVal값: " + doubleVal);
        	System.out.println("stringVal3값:" + stringVal3);
		System.out.println("stringVal4값:" + stringVal4);
	}
}

 

실행 결과

 

 

위의 코드를 보시면 문자열로 되어 있는 값들을 valueOf라는 메서드를 이용하여 int와 double로 각각 변환을 시켜줄 수 있습니다.

 

또한 toString이라는 것을 이용하여 int에서 String으로 변환을 시켜줄 수도 있습니다. (하지만 String으로 변환시킬 때는 stringVal4에 표현된 것처럼 변환하시는 것이 더 효율적인 방법입니다.)

 

이런 변환들은 위에 말씀드린 것처럼 Promotion과 Casting으로는 불가능 한 변환입니다.

 

그리고 여기서 하나 이상한 부분을 말씀드리자면 valueOf라는 메서드는 리턴 값이 Wrapper Class로 명시되어 있습니다.

 

하지만 코드들을 보면 선언된 타입이 Wrapper Class인 Integer와 Double이 아니라 자료형인 int와 double로 되어 있죠?

 

이 부분은 아래에서 다시 한번 말씀드리도록 하겠습니다.

 

또 다른 기능 중 주관적으로 생각하는 자주 사용되는 것은 자료형들의 최대, 최솟값이 명시되어 있는 상수값들입니다.

 

다음 코드들을 한번 봅시다.

 

 

728x90

 

 

package wrapper;

public class MinMax {
	public static void main(String[] args) {
		System.out.println("Integer");
		System.out.println(Integer.MAX_VALUE);
		System.out.println(Integer.MIN_VALUE);
		
		System.out.println("Double");
		System.out.println(Double.MAX_VALUE);
		System.out.println(Double.MIN_VALUE);
	}
}

 

실행 결과

 

 

위의 코드처럼 Wrapper Class에 명시되어 있는 MAX_VALUE, MIN_VALUE라는 상수값을 출력해보면 이런 결과가 나오게 됩니다.

 

이걸 보시고도 자료형에 들어갈 수 있는 값의 범위를 세세하게 외우시는 분은 없으시겠죠?

 

하나를 더 말씀드리자면 정수 값을 이진수로 변환하는 메서드들도 제공해줍니다.

 

다음 코드를 한번 보겠습니다.

 

package wrapper;

public class toBinary {
	public static void main(String[] args) {
		int intVal = 7;
		
		System.out.println(Integer.toBinaryString(intVal)); // 111
	}
}

 

 

코드에 표현된 것은 7이라는 정수 값을 이진수로 표현했을 때 111이라는 값으로 나온다는 것입니다.

 

이진수뿐만 아니라 8진수, 16진수 등의 값들도 구하는 메서드들도 있고 이런 것들 뿐만 아니라 효율적으로 사용될 수 있는 메서드들이 다양하게 많이 구현되어 있으니 어떤 메서드들이 있는지 꼼꼼히 찾아보는 것을 추천드립니다.

 

 

 

Wrapper Class를 사용하는 두 번째 이유는 OOP의 특징 중 하나인 은닉화를 위해서입니다.

 

기본적인 자료형을 사용할 때는 외부에서 메모리의 바이트 수만 조사해 보면 자료형이 무엇인지를 대충 짐작할 수 있다고 합니다.

 

이런 부분을 보완하기 위해 Wrapper Class로 자료형을 감싸 외부에 어떤 자료형을 사용했는지 노출시키지 않기 위해서도 사용된다고 합니다.

 

지금까지 Wrapper Class를 사용하고자 하는 이유 2가지에 대해서 얘기해봤고 아까 위에서 얘기하다가 만 Wrapper Class의 값을 어떻게 자료형에 집어넣는지에 대해 적어보겠습니다.

 

이 개념에 대해 이해하기 위해서는 박싱(boxing)과 언박싱(unboxing), 오토 박싱(autuboxing)에 대해 알고 있어야 됩니다.

 

 

박싱 / 언박싱

 

박싱과 언박싱은 매우 간단합니다.

 

위에서 언급했던 자료형과 Wrappr Class 간의 변환을 의미하는 것으로 자료형에서 Wrapper Class가 되기 위해 감싸주는 것을 박싱, Wrapper Class에서 자료형의 값을 얻어내는 것을 언박싱이라고 합니다.

 

 

오토 박싱

 

그럼 오토 박싱은 무엇일까요?

 

오토 박싱은 박싱과 언박싱을 자바에서 자동으로 해주는 것을 의미합니다.

 

이것도 코드를 보면서 추가적으로 말씀드리겠습니다.

 

package wrapper;

public class Boxing {
	public static void main(String[] args) {
    		// JDK 1.5버전 이전
		Integer integerVal = new Integer(5);
		int intVal1 = integerVal.intValue();
		
		System.out.println("intVal1값: " + intVal1);
		
        	// JDK 1.5버전 이후
		int intVal2 = new Integer(3);
		
		System.out.println("intVal2값: " + intVal2);
	}
}

 

 

위의 코드와 같이 JDK 1.5 버전 이전에는 자료형을 Wrapper Class로 감싸주는 박싱을 하기 위해서는 new Integer(x)를 이용하여 감싸줬습니다.

 

반대로 Wrappr Class에서 자료형을 얻는 언박싱을 해주기 위해서는 intValue()와 같은 메서드를 이용했습니다.

 

하지만 JDK 1.5 버전 이후로는 이런 번거로운 작업이 필요 없이 자동으로 박싱과 언박싱이 이루어져 서로 같은 타입이라고 생각하고 코드를 작성해도 에러가 발생되지 않습니다.

 

이런 이유들을 생각하고 처음 이 내용에 대해 작성되었던 코드로 되돌아가 본다면 전혀 문제가 없다는 것을 느끼실 수 있을 겁니다.

 

저도 이 글을 작성하면서 곰곰이 생각해보면 제가 작성한 코드들 중 오토 박싱이 추가되지 않았다면 문제가 될만한 코드들이 많이 생각나고 있습니다.

 

또한 Wrapper Class도 생각보다 많이 사용을 해왔구나 라고 느껴지기도 합니다.

 

그만큼 자바로 프로그래밍을 하면서 빼먹을 수 없는 부분 중에 하나이고 명확하게 알고 넘어가야 되는 부분 중에 하나인 것을 다시 한번 느끼는 시간입니다.

 

 

 

이상으로 Wrapper Class (+박싱)에 대해 간단하게 알아보는 시간이었습니다.

 

읽어주셔서 감사합니다.

728x90
반응형

댓글