⛏️/JAVA

[JAVA] 30. Wrapper 클래스

defyuil 2023. 10. 17. 12:59

Wrapper 클래스

- 기본 데이터타입을 객체 형태로 관리해주는 클래스의 모음
-> java.lang 패키지에 위치
 - 기본 데이터타입과 1:1로 대응하는 8개의 클래스를 제공 (Byte, Short, Integer, Long, Float, Double, Boolean, Character)
- Wrapper 클래스에서 제공하는 상수와 메서드 등을 활용하여 기본 데이터타입 데이터를 다양하게 처리할 수 있음

 

 

 

		System.out.println("byte 타입 메모리 크기(bit) : " + Byte.SIZE);
		System.out.println("byte 타입 메모리 크기(byte): " + Byte.BYTES);
		System.out.println("byte 타입의 최소값 : " + Byte.MIN_VALUE);
		System.out.println("byte 타입의 최소값 : " + Byte.MAX_VALUE);
		
		System.out.println();
		
		System.out.println("Short 타입 메모리 크기(bit) : " + Short.SIZE);
		System.out.println("Short 타입 메모리 크기(byte): " + Short.BYTES);
		System.out.println("Short 타입의 최소값 : " + Short.MIN_VALUE);
		System.out.println("Short 타입의 최소값 : " + Short.MAX_VALUE);
		
		System.out.println();
		
		System.out.println("char 타입 메모리 크기(bit) : " + Character.SIZE);
		System.out.println("char 타입 메모리 크기(byte): " + Character.BYTES);
		System.out.println("char 타입의 최소값 : " + (int)Character.MIN_VALUE);
		System.out.println("char 타입의 최소값 : " + (int)Character.MAX_VALUE);
		
		System.out.println();
		
		System.out.println("int 타입 메모리 크기(bit) : " + Integer.SIZE);
		System.out.println("int 타입 메모리 크기(byte): " + Integer.BYTES);
		System.out.println("int 타입의 최소값 : " + Integer.MIN_VALUE);
		System.out.println("int 타입의 최소값 : " + Integer.MAX_VALUE);
		
		System.out.println();
		
		System.out.println("long 타입 메모리 크기(bit) : " + Long.SIZE);
		System.out.println("long 타입 메모리 크기(byte): " + Long.BYTES);
		System.out.println("long 타입의 최소값 : " + Long.MIN_VALUE);
		System.out.println("long 타입의 최소값 : " + Long.MAX_VALUE);
		
		System.out.println();
		
		System.out.println("float 타입 메모리 크기(bit) : " + Float.SIZE);
		System.out.println("float 타입 메모리 크기(byte): " + Float.BYTES);
		System.out.println("float 타입의 최소값 : " + Float.MIN_VALUE);
		System.out.println("float 타입의 최소값 : " + Float.MAX_VALUE);
		
		System.out.println();
		
		System.out.println("double 타입 메모리 크기(bit) : " + Double.SIZE);
		System.out.println("double 타입 메모리 크기(byte): " + Double.BYTES);
		System.out.println("double 타입의 최소값 : " + Double.MIN_VALUE);
		System.out.println("double 타입의 최소값 : " + Double.MAX_VALUE);
		
		System.out.println();

 

 

오토 박싱(Auto Boxing)

- 기본 데이터타입 -> Wrapper 클래스타입의 객체로 자동으로 변환하는 기능
(ex. int -> Integer, char -> Character)


오토 언박싱(Auto Unboxing)

- Wrapper 클래스 타입 객체 -> 기본 데이터타입으로 자동으로 변환하는 기능
(ex. Integer -> int, Character -> char)

 

		// 기본 데이터타입 변수 선언
		int num1 = 10; // 정수 데이터 10을 기본 데이터타입 변수 num1에 저장
		int num2;
		
		// 기본 데이터타입 변수는 그대로 출력하면 저장된 정수 데이터가 출력됨
		// -> 즉, 변수에 저장된 데이터가 실제 사용하는 데이터
		System.out.println("기본 데이터타입 변수 num1의 값 = " + num1);
		
		// Integer 타입 변수 선언 및 객체 생성
		Integer n1;
//		Integer n2 = new Integer(20);
		// -> 정수 20을 갖는 인스턴스를 생성하고 해당 주소값을 Integer 타입 참조변수
		//    n2에 저장
		Integer n2 = new Integer("20"); // 문자열로 된 정수를 실제 정수로 변환
		
		// 참조 데이터타입 변수는 그대로 출력하면 원래 주소값이 출력되어야 하지만
		// Wrapper 클래스에서는 toString()메서드가 오버라이딩 되어 있으므로
		// 객체가 저장한 값을 문자열로 리턴하므로 데이터 출력 가능함
		System.out.println("참조 타입 변수 n2의 값 = "+ n2); // toString()생략
		
		System.out.println("----------------------------");
		
		// 기본 데이터타입은 stack 공간에 실제 데이터 형태를 직접 관리하지만
		// 객체는 Heap 공간에 실제 데이터가 저장되고,
		// 해당 주소값을 stack 공간에서 관리함
		// 따라서, 기본 데이터타입 변수와 참조 데이터타입 변수는 호환이 불가능!
		// 기본데이터타입 <-> 참조데이터타입 변환 시 메서드 등을 활용해야했음
		
		n1 = Integer.valueOf(num1);
		// -> int형 데이터를 Integer 타입 객체로 변환하여 저장
		System.out.println(num1 + ", "+ n1); // 10, 10
		
		// Java 1.5부터 기본형 -> Wrapper 클래스타입으로 변환 시
		// 메서드를 호출하는 변환 과정을 생략해도 자동으로 변환을 수행하도록 변경됨
		// -> 즉, 대입연산자를 통해 직접 대입이 가능하도록 바뀌었음
		n1 = num1; // 기본 데이터를 자동으로 Integer 타입으로 변환하여 저장
		// -> 오토 박싱(Auto Boxing)
		System.out.println(num1 + "," + n1); // 10,10
		
		// Heap공간에 생성된 wrapper 클래스타입 객체를 기본형 변수에 저장할 경우
		num2 = n2.intValue(); // Integer 객체 -> int 타입으로 변환하는 메서드
		// -> 오토 언박싱을 활용할 경우 자동으로 변환을 수행해준다!
		num2 = n2; // Integer 객체 -> 기본 데이터타입으로 자동 변환
		// -> 오토 언박싱
		
		System.out.println(num2 + ","+ n2); // 20, 20
		
		System.out.println("-----------------------------");
		
		int num3 = 10;
	    Integer n3 = 20;
	    System.out.println(num3 + n3);
	    // -> 기본 데이터타입과 Wrapper 클래스타입간의 연산을 수행할 경우
	    //    Wrapper 클래스 타입 객체를 오토 언박싱 후 연산을 수행함
	    
	    System.out.println("--------------------------");
	    
	    // Object 타입 변수에 기본 데이터타입 저장 가능하다!
	    // -> 단, 기본 데이터타입 -> Wrapper 클래스 타입으로 오토박시 후
	    //    다시 Wrapper 클래스 타입 객체 -> Object 타입으로 업캐스팅 일어남
	    
	    Object o = 10;
	    System.out.println(o); // toString()메서드 호출 생략되어 있음

 

 

문자열 -> 기본 데이터타입으로 변환

- 주로 웹에서 form 태그의 input 태그로 데이터를 입력받거나 자바, 안드로이드 등의 GUI 환경에서 데이터를 입력받을 때 수치데이터를 입력하더라도 모두 문자열로 취급됨
=> 따라서, 해당 문자열을 실제 연산을 하기 위해 기본 데이터타입으로 변환하려면 Wrapper 클래스에서 제공하는 메서드를 통해 변환을 수행해야 한다

 

< 기본 문법 규칙 >

Wrapper클래스명.parse기본데이터타입명(문자열변수 또는 데이터)
=> ex) 정수형으로 변환할 경우 Integer.parseInt() / 실수형으로 변환할 경우 Double.pareseDouble()

 

		String strNum = "100.0";
		
//		int iNum = Integer.parseInt(strNum);
		// String 타입 문자열 실수 -> int형으로 변환하려 할 경우
		// 실제 데이터가 실수이므로 정수형으로 변환이 불가능한 관계이며
		// 문법적으로 문제가 없지만, 실행 시점에서 오류 발생함!
		// => NumberFormatException 예외 발생!
//		int i = 100.0; // int형 변수에 실수를 저장하지 못하는 것과 동일함
		
		double dNum = Double.parseDouble(strNum); 
		System.out.println(dNum);
		
		// 기본데이터타입이 아닌 Wrapper 클래스 타입으로 변환도 가능함
		Double dNum2 = new Double(strNum); // 생성자에 문자열 전달
		System.out.println(dNum2);
		
		strNum = "1234";
		// int형 변수 iNum 에 문자열 "1234" 를 변환하여 저장
		int iNum = Integer.parseInt(strNum);
		System.out.println(iNum);

 

 

 

 

 Wrapper 클래스의 다양한 메서드

- 기본 데이터타입을 다양하게 처리하기 위한 메서드가 제공됨
 - 주로 static 메서드 형태로 호출하여 사용 (클래스명.메서드명() 형태로 호출)
- 기본 데이터타입과 Wrapper 클래스 객체 모두 활용 가능

 

 

		int num1 = 10, num2 = 20;
		Integer n1 = 10, n2 = 20;
		
		// max() : 두 정수의 최대값을 계산하는 메서드
		System.out.println(Integer.max(num1, num2)); // 기본데이터타입과
		System.out.println(Integer.max(n1, n2));	 // Wrapper 클래스 타입 모두 사용
		
		// min() : 두 정수의 최소값을 계산하는 메서드
		System.out.println(Integer.min(num1, num2));
		
		// 10진수 정수를 다양한 형태의 진법으로 변환할 경우
		// Integer.toXXXString() 메서드를 호출하여 해당 진법으로 변환 가능
		// => XXX 은 각 진법명 지정(2진법: Binary, 8진법 : Octal, 16진법 : Hex)
		System.out.println("정수 10을 2진수로 변환 : " + Integer.toBinaryString(num1));
		System.out.println("정수 10을 8진수로 변환 : " + Integer.toOctalString(num1));
		System.out.println("정수 10을 16진수로 변환 : " + Integer.toHexString(num1));
		
		System.out.println("=========================================");
		
		// Character 클래스를 활용한 문자 데이터 처리
		// => 주로 특정 문자에 대한 판별을 수행(Character.isXXX() 하거나
		//    변환(Character.toXXX())을 수행
		
		char ch = 'R';
		System.out.println("원본 데이터 : " + ch);
		
		// 입력받은 문자 ch 에 대한 대문자, 소문자, 숫자, 기타문자 판별
		// => 대문자 : 문자 ch 가 'A'(65) 이상이고, 문자 ch 가 'Z'(92) 이하
		if(ch >= 'A' && ch <= 'Z') {
			System.out.println(ch + " : 대문자!");
		} else if(ch >= 'a' && ch <= 'z') {
			System.out.println(ch + " : 소문자!");
		} else if(ch >= '0' && ch <= '9') {
			System.out.println(ch + " : 숫자!");
		} else {
			System.out.println(ch + " : 기타문자!");
		}
		
		System.out.println("-----------------------------------");
		
		// Character 클래스의 isXXX() 메서드를 활용하여 각 판별을 대체하고
		// toXXX() 메서드를 활용하여 변환을 수행
		ch = ' ';
		if(Character.isUpperCase(ch)) {
			System.out.println(ch + " : 대문자!");
			
			// 대문자 -> 소문자 변환
//			ch += 32;
//			System.out.println("소문자로 변환한 결과 : " + ch);
			System.out.println("소문자로 변환한 결과 : " + Character.toLowerCase(ch));
		} else if(Character.isLowerCase(ch)) {
			System.out.println(ch + " : 소문자!");
			System.out.println("대문자로 변환한 결과 : " + Character.toUpperCase(ch));
		} else if(Character.isDigit(ch)) {
			System.out.println(ch + " : 숫자!");
		} else if(Character.isWhitespace(ch)) {
//			Character.isSpace(ch) 사용 X
			System.out.println(ch + " : 공백문자!");
		} else {
			System.out.println(ch + " : 기타문자!");
		}

	}

 

 

TEST

package wrapper_class;

public class Test4_2 {

	public static void main(String[] args) {
		/*
		 * 문자열(패스워드)을 char[] 배열에 분리하여 저장 후
		 * 해당 패스워드에 대한 안전도 검사(패스워드 복잡도 검사)
		 * - 배열 내의 각 문자에 대해 다음 사항을 판별하여
		 *   해당 되는 항목이 있을 경우 점수를 증가시키고
		 *   해당 점수에 따라 안전도 레벨을 출력
		 * 1) 대문자가 포함될 경우 +1점
		 * 2) 소문자가 포함될 경우 +1점
		 * 3) 숫자가 포함될 경우 +1점
		 * 4) 특수문자 !가 포함될 경우 +1점
		 * => 최대 점수 4점, 최소 점수 1점이며 다음 결과 출력
		 * 1) 4점 : "패스워드 안전도 : 안전" 출력
		 * 2) 3점 : "패스워드 안전도 : 보통" 출력
		 * 3) 2점 : "패스워드 안전도 : 위험" 출력
		 * 4) 1점 : "패스워드 안전도 : 사용 불가!" 출력
		 * 
		 * ex) 'a', 'd', 'm', 'i', 'n', '1', '2', '3' 일 경우
		 *     소문자 포함(+1), 숫자 포함(+1) 이므로 총점 2점
		 *     "패스워드 안전도 : 위험" 출력
		 */
		
		// String -> char[] 변환
		String password = "1aB!";
		char[] chArr = password.toCharArray(); 
		
		// 안전도 점수를 저장할 변수 선언 및 초기화
		int point = 0;
		
		// 각 체크 항목별 포함 여부를 저장하는 변수 선언(boolean 타입 적절)
		boolean isUpperCase = false; // 대문자 판별 결과
		boolean isLowerCase = false; // 소문자 판별 결과
		boolean isDigit = false; // 숫자 판별 결과
		boolean isSpec = false; // 특수문자 판별 결과
				
		// 반복문을 사용하여 배열 반복(항목 포함 여부 체크)
		// => 각 항목 여부를 판별(Wrapper 클래스의 isXXX() 메서드 활용)
		// => 해당 항목이 포함되어 있을 경우 boolean 타입 변수 값을 true로 변경
		for(int i = 0; i < chArr.length; i++) {
			if(Character.isUpperCase(chArr[i])) { // 대문자 판별
				isUpperCase = true;
			} else if(Character.isLowerCase(chArr[i])) { // 소문자 판별
				isLowerCase = true;
			} else if(Character.isDigit(chArr[i])) { // 숫자 판별
				isDigit = true;
			} else if(chArr[i] == '!') {
				isSpec = true;
			}
		}
		
		// 각 항목 포함 여부를 체크하여 포함되었을 경우 점수 1점 증가(if문 활용)
		if(isUpperCase)	point++;
		if(isLowerCase) point++;
		if(isDigit) point++;
		if(isSpec) point++;
					
		// 점수에 따라 안전도 출력
		switch(point) {
			case 4 : System.out.println(password + " : 안전!"); break;
			case 3 : System.out.println(password + " : 보통!"); break;
			case 2 : System.out.println(password + " : 위험!"); break;
			default : System.out.println(password + " : 사용 불가능한 패스워드!");
		}
		

	}

}