[JAVA] 30. Wrapper 클래스
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 + " : 사용 불가능한 패스워드!");
}
}
}