Notice
Recent Posts
Recent Comments
관리 메뉴

Developer Gonie

[3주차] 61. Wrapper 클래스의 메소드 및 박싱/언박싱 *** 본문

K-DigitalTraining 강의/1. Java

[3주차] 61. Wrapper 클래스의 메소드 및 박싱/언박싱 ***

이대곤 2022. 6. 2. 12:10

* 래퍼(Wrappper) 클래스란?

프로그래밍을 하다 보면 기본 타입의 데이터를 객체로 표현해야 하는 경우가 종종 있는데, 이럴 때 기본 자료형 값을 객체로 변환하기 위해 사용하는 클래스들을 래퍼 클래스라고 하고, 이를 이용해 만들어진 객체를 래퍼 객체라고 한다. 래퍼 클래스는 각각의 타입에 해당하는 데이터를 인수로 전달받아, 해당 값을 가지는 객체로 만들어 준다. 프로그래밍적이지 않게 표현하면 숫자를 박스에 넣고 포장시키는 것이다. 이를 위한 래퍼 클래스는 모두 java.lang 패키지에 포함되어 제공된다. 따라서, 아래의 래퍼클래스들을 사용하기 위해서 import를 해주지 않아도 사용이 가능하다.

 

기본 데이터 타입에는 아는 바와 같이 8가지가 있고(byte, short, int, long, float,double,char, boolean) 이들을 위한 래퍼클래스는 다음과 같이 매칭되어 존재한다.

 

래퍼클래스들은 기본 데이터 타입과 달리 유용한 멤버함수를 가지고 있기 때문에 알고리즘 문제해결 과정중에 자주 사용될 것이니 잘 알아두자. 사용되는 한 가지 예시로, 래퍼클래스를 사용하면 문자열로 된 정수를 정수형으로 변환할 수 있다.

* 박싱 / 언박싱

기본 타입의 데이터를 래퍼클래스의 객체로 바꾸는 것을 박싱이라하고, 래퍼클래스의 객체를 기본 타입의 데이터로 되돌리는 것을 언박싱이라고 한다. JDK 1.5부터는 박싱과 언박싱이 필요한 상황에서 자바 컴파일러가 이를 자동으로 처리해 준다고 한다. 이렇게 자동화된 박싱과 언박싱을 오토 박싱(AutoBoxing)과 오토 언박싱(AutoUnBoxing)이라고 부른다. 다음 예제는 박싱과 언박싱, 오토 박싱과 오토 언박싱의 차이를 보여주는 예제이다. 오토박싱, 오토언박싱이 이뤄지기 때문에 Integer - int 간의 연산 또는 서로에 대한 교차된 값 할당시 별도의 작업이 필요 없음을 알자.

// int형 숫자를 래퍼클래스 Integer 객체로 전환하는 것 : 박싱
Integer num = new Integer(17); 

// 래퍼클래스 Integer 객체를 int형 숫자로 되돌리는 것 : 언박싱
int n = num.intValue();


// 오토박싱, char형 문자를 래퍼클래스에 할당하면 자동으로 래퍼클래스 Character 객체로 변환됨
Character ch = 'X'; // Character ch = new Character('X'); 자동으로 이뤄짐

// 오토언박싱, 래퍼클래스 Character 객체를 char형 변수에 할당하면 자동으로 char형 문자로 변환됨
char c = ch;        // char c = ch.charValue(); 자동으로 이뤄짐

/*<추가예시>*/
//기본자료형 중 int형 값을 래퍼클래스를 이용해 래퍼객체로 만드는 박싱 
Integer it1 = new Integer(11);
Integer it2 = new Integer(22);
System.out.println(it1 + it2);  // 래퍼객체지만 덧셈이 정상적으로 수행됨
System.out.println();
				
//컴파일 중 자동으로 오토박싱이 일어나는 코드
Integer it3 = 11;  	  	// Integer it3 = new Integer(11) 자동으로 일어남
Integer it4 = 22;    	// Integer it4 = new Integer(22) 자동으로 일어남
System.out.println(it3 + it4); // 래퍼객체지만 덧셈이 정상적으로 수행됨
System.out.println();

//컴파일 중 자동으로 오토언박싱이 일어나는 코드, 래퍼객체를 기본자료형 변수에 할당 할 때
int it5 = new Integer(11) ; // new Integer(11) -> 11		
double d = new Double(1.1); // new Double(1.1) -> 1.1

// int형 값 - Integer 래퍼객체 간의 연산 혹은 교차 할당이 아주 정상적으로 작동하는 예시
Integer a1 = new Integer(11);
int b1 = 22;
System.out.println(a1 + b1);
System.out.println();

Integer a2 = 11;
int b2 = new Integer(22);
System.out.println(a2 + b2);
System.out.println();

레퍼클래스 활용 예시코드

- 알고리즘 문제해결 과정중에 자주 사용될만한 래퍼클래스 활용 코드

public class Ex08_05_wrapper {
	public static void main(String[] args) {

		//언제 레퍼클래스를 사용하는가?
		int t = 100;
		String s = String.valueOf(t); // 정수를 문자열로 변환
		//100+"" -> 이것도 결과는 문자열임
        
		int x = Integer.parseInt("100"); // 문자를 정수로 변환해주는 역할을 하는데 기본형 int 로 반환함
		int y = Integer.parseInt("200");
		System.out.println(x+y);		// 300 
		System.out.println();

		double z = Double.parseDouble("1.1");
		System.out.println(z); 			// 1.1
		System.out.println();

		//문자를 정수형으로 변환할 수 있는 메소드를 제공하는 래퍼클래스
		Integer t = Integer.valueOf("100");
		Integer u = Integer.valueOf("200");
		System.out.println(t+u);		// 300
		System.out.println();

		// 문자열 숫자 정수형으로 변환하여 총합구하기
		String[] arr2 = {"10","20","30","40","50"};
		int sum = 0;
		for(String s: arr2)
			sum += Integer.parseInt(s);
		System.out.println("총합:"+sum);
		System.out.println();

		// 문자열을 숫자만 분리해서 총합구하기
		String[] arr3 = {"슬기:80", "크리스탈:90", "아이유:40"};
		sum = 0;
		for(int i = 0; i< arr3.length; i++) {
			int index = arr3[i].indexOf(":");
			String s = arr3[i].substring(index+1);
			sum += Integer.parseInt(s);
		}
		System.out.println("총합:"+sum);
	}
}

실행결과

33

33

300

1.1

300

총합:150

총합:210

 

Comments