서노썬
sun noes sun
서노썬
전체 방문자
오늘
어제
  • 카테고리 (142)
    • Java (89)
      • Day1 (20)
      • Day2 (16)
      • Day3 (4)
      • Day4 (5)
      • Day5 (2)
      • Day6 (2)
      • Day7 (4)
      • Day8 (6)
      • Day9 (3)
      • Day10 (0)
      • Day11 (0)
      • Day12 (0)
      • Day13 (3)
      • Day14 (0)
      • Day15 (0)
      • Day16 (0)
      • Day19 (0)
      • Day20 (0)
      • Day21 (2)
      • Day22 (4)
      • Day23 (2)
      • Day24 (5)
      • Day25 (4)
      • Day27 (2)
      • Day28 (3)
      • Day29 (1)
      • Day30 (1)
      • Day31 (0)
      • Day32 (0)
      • Dat33 (0)
      • Day34 (0)
      • Day35 (0)
      • Day36 (0)
    • HTML (37)
      • Day36 (20)
      • Day37 (3)
      • Day38 (2)
      • Day39 (8)
      • Day40 (3)
    • SQL (4)
      • Day40 (4)
      • Day41 (0)
      • Day42 (0)
      • Day43 (0)
      • Day44 (0)
      • Day45 (0)
    • JSP (0)
      • Day46 (0)
      • Day75 (0)
    • PYTHON (0)
      • Day75 (0)
      • Day76 (0)
    • Photo (12)

블로그 메뉴

  • 홈
  • 방명록

인기 글

최근 글

태그

  • 자바break
  • 자바자료형
  • 자바continue
  • 논리연산자
  • java자료형
  • 자바연산자
  • 자바
  • Java
  • java데이터타입
  • java메뉴입력

티스토리

hELLO · Designed By 정상우.
서노썬

sun noes sun

Java/Day25

[Java] Wrapper 클래스

2021. 12. 7. 20:10

 Wrapper 클래스 

'Wrapper 클래스'라는 이름에는 '감싸는 클래스'라는 의미가 담겨있다. Wrapper 클래스는 기본 자료형의 데이터를 감싸는 클래스라고 생각하면 된다.

Wrapper 클래스의 종류			기본 생성자
Boolean					Boolean(boolean value)
Character					Character(char value)
Byte					Byte(byte value)
Short					Short(short value)
Integer					Integer(int value)
Long					Long(long value)
Float					Float(float value), Float(double value)
Double					Double(double value)

위에서 보이듯이 모든 기본 자료형에 해당하는 Wrapper 클래스가 정의되어 있다.  그리고 위에서는 보이지 않고 있지만,  Character 클래스를 제외한 모든 Wrapper 클래스에는 String의 참조 값을 인자로 받는 생성자들이 정의되어 있어서 다음과 같이 문자열로 표현된 데이터를 기반으로 하는 인스턴스의 생성도 가능하다.

Interger num1 = new Integer("240");
Double num2 = new Double("12.257");

Wrapper 클래스의 가장 기본이 되는 두 가지 기능으로 Boxing과 Unboxing이 있다.

[ Boxing ]

기본 자료형 데이터를 인스턴스화 시키는 작업을 가리켜 Boxing이라 한다. Boxing은 인스턴스의 생성에 의해서 이뤄진다.

 

[ Unboxing ]
반면 인스턴스에 저장되어 있는 기본 자료형 데이터를 꺼내는 작업을 가리켜 Unboxing이라 하는데, 이는 Wrapper 클래스에 정의된 메소드의 호출에 의해서 이뤄진다.

 

class BoxingUnboxing
{	
	public static void main(String[] args)
	{
		Integer iValue=Integer.valueOf(10);
		Double dValue=Double.valueOf(3.14);
		
		System.out.println(iValue);
		System.out.println(dValue);
		
		iValue=iValue.intValue()+10;
		dValue=dValue.doubleValue()+1.2;
		
		System.out.println(iValue);
		System.out.println(dValue);		
	}
}

 

※ 참고

Wrapper 클래스는 산술연산을 위해 정의된 클래스가 아니다. 따라서 Wrapper 클래스의 인스턴스에 저장된 값은 변경이 불가능하다. 다만 위 예제에서 보인 것처럼 증가된 값을 저장하는 새로운 인스턴스의 생성 및 참조는 가능하다.

 

class AutoBoxingUnboxing
{	
	public static void main(String[] args)
	{
		Integer iValue=10; 		// Interger형 참조 변수에는 Integer형 인스턴스의 참조 값이 저장되어야 한다.
					// 그런데 이 문장에서는 정수 10을 저장하려 하고 있다. 이러한 경우에는
					// 정수 10을 바탕으로 Integer형 인스턴스가 자동으로 생성되고,
					// 이 인스턴스의 참조 값이 대신 저장된다. 그리고 이러한 현상을 가리켜
					// Auto Boxing이라 한다.	
		Double dValue=3.14;	// Auto Boxing
		
		System.out.println(iValue);	
		System.out.println(dValue);
		
		int num1=iValue;		// num1에 저장될 값으로 int형 데이터가 등장해야 하는데, Integer형 참조변수 iValue
						// 가 등장하였다. 이 경우에는 iValue.intValue()가 자동으로 호출되어, 그 반환 값이 변수
						// num1에 저장된다. 그리고 이러한 현상을 가리켜 Auto Unboxing이라 한다.
		double num2=dValue;		// Auto Unboxing
		System.out.println(num1);
		System.out.println(num2);
	}
}

 

위 예제에서 보이듯이 integer형 참조변수가 와야 할 위치에 int형 데이터가 오면 Auto Boxing이 진행된다. 그리고 int형 데이터가 와야 할 위치에 Integer형 참조변수가 오면 Auto Unboxing이 진행된다.  이러한 Auto Boxing과 Auto Unboxing은 보다 다양한 상황에서 다양한 형태로 적용이 되어,  다음 예제에서 보이는 코드의 구성도 허용한다.

 

class AutoBoxingUnboxing2
{	
	public static void main(String[] args)
	{
		Integer num1=10;
		Integer num2=20;
		
		num1++;				// Unboxing과 Boxing이 동시에 진행된다.
						// num1 = Integer.valueOf(num1.intValue() + 1);
		System.out.println(num1);
		
		num2+=3;			// num2 = Integer.valueOf(num2.intValue() + 3);
		System.out.println(num2);	
		
		int addResult=num1+num2;
		System.out.println(addResult);
		
		int minResult=num1-num2;	
		System.out.println(minResult);	
	}
}

 

Wrapper 클래스는 산술연산을 위해 정의된 클래스가 아니라고 하였는데, 이 사실에는 변함이 없다. 다만 이러한 Wrapper 클래스가 Auto Boxing과 Auto Unboxing으로 인해서 산술연산이 가능해졌을 뿐이다.


 Wrapper 클래스 문제 (1) 

String[] phoneNumArr = {
				"012-3456-7890",
				"099-2456-7980",
				"088-2346-9870",
				"013-3456-7890"
		};

- 실행결과

>>234

[012-3456-7890, 088-2346-9870]
>>

 

위의 전화번호를 검색하는 프로그램을 작성해보자.

import java.util.Scanner;
import java.util.Vector;

public class SearchTest {

	public static void main(String[] args) {
		String[] phoneNumArr = {
				"012-3456-7890",
				"099-2456-7980",
				"088-2346-9870",
				"013-3456-7890"
		};
//		Vector<String> list = new Vector<String>(); // 검색결과를 담을 Vector 
		Vector list = new Vector(); 
		Scanner s = new Scanner(System.in);
		while(true) {
			System.out.print(">>");
			String input = s.nextLine().trim(); // trim()으로 입력내용에서 공백을 제거
			if(input.equals("")) {
				continue;
			} else if(input.equalsIgnoreCase("Q")) {
				System.exit(0);
			}

			for(int i=0;i<phoneNumArr.length;i++) {
				String phoneNum = phoneNumArr[i];
				String tmp = phoneNum.replace("-",""); // phoneNum에서 '-'를 제거
				if(tmp.contains(input)) { // 찾는 문자열이 있으면
					list.add(phoneNum);
				}				
			}

			if(list.size()>0) { // 검색결과가 있으면
				System.out.println(list); // 검색결과를 출력하고
				list.clear(); // 검색결과를 삭제
			} else {
				System.out.println("일치하는 번호가 없습니다.");
			}
		}
	}
}

 Wrapper 클래스 문제 (2) 

char[] dest = new char[10];
char[] src = {'1', '2', '3', '4'};

위의 두 개의 배열을 이용하여 다음과 같이 출력 결과가 나오도록 하자.

왼쪽 정렬
1234000000
오른쪽 정렬
0000001234
가운데 정렬
0001234000

 

public class SortTest {

	public static void main(String[] args) {
		char[] dest = new char[10];
		char[] src = {'1', '2', '3', '4'};
	
		
		for(int i=0;i<dest.length;i++)	// 배열 전체를 '0'으로 초기화
			dest[i] = '0';
		
		System.out.println("왼쪽 정렬");
		System.arraycopy(src, 0, dest, 0, src.length);
		System.out.println(dest);
		
		for(int i=0;i<dest.length;i++)	// 배열 전체를 '0'으로 초기화
			dest[i] = '0';		
		
		System.out.println("오른쪽 정렬");
		System.arraycopy(src, 0, dest, dest.length - src.length, src.length);
		System.out.println(dest);
		
		for(int i=0;i<dest.length;i++)	// 배열 전체를 '0'으로 초기화
			dest[i] = '0';		
		
		System.out.println("가운데 정렬");
		System.arraycopy(src, 0, dest, (dest.length - src.length)/2, src.length);
		System.out.println(dest);
	}

}

'Java > Day25' 카테고리의 다른 글

[Java] Clone 문제 (깊은 복사, 얕은 복사, 공변반환)  (0) 2021.12.07
[Java] 인스턴스 복사 clone 메소드  (0) 2021.12.06
[Java] isEquals  (0) 2021.12.06
    'Java/Day25' 카테고리의 다른 글
    • [Java] Clone 문제 (깊은 복사, 얕은 복사, 공변반환)
    • [Java] 인스턴스 복사 clone 메소드
    • [Java] isEquals

    티스토리툴바