public class Ex4 {
public static void main(String[] args) {
/*
* Wrapper 클래스
*
*/
// Wrapper 클래스에서 제공되는 상수
System.out.println("byte 타입 메모리 크기 : " + Byte.SIZE + " bit");
System.out.println("byte 타입 메모리 크기 : " + Byte.BYTES + " byte");
System.out.println("byte 타입 최소값 : " + Byte.MIN_VALUE);
System.out.println("byte 타입 최대값 : " + Byte.MAX_VALUE);
System.out.println("short 타입 메모리 크기 : " + Short.SIZE + " bit");
System.out.println("short 타입 메모리 크기 : " + Short.BYTES + " byte");
System.out.println("short 타입 최소값 : " + Short.MIN_VALUE);
System.out.println("short 타입 최대값 : " + Short.MAX_VALUE);
// char타입 메모리 크기 및 최소값 최대값
System.out.println("char 타입 메모리 크기 : " + Character.SIZE + " bit");
System.out.println("char 타입 메모리 크기 : " + Character.BYTES + " byte");
System.out.println("char 타입 최소값 : " + (int) Character.MIN_VALUE);
int max = Character.MIN_VALUE; // 자동 형변환
System.out.println("char 타입 최대값 : " + (int) Character.MAX_VALUE);
}
}
package ex_wrapper;
public class Ex1 {
public static void main(String[] args) {
/*
* Wrapper 클래스
*
*/
// int형 기본 데이터타입 변수 num1 선언
int num1 = 10; // 정수 10을 변수 num1에 저장
// => Stack 영역의 변수 num1에 정수형 리터럴 10 저장됨
System.out.println(num1); // 기본데이터타입 변수의 값 출력
System.out.println("===================================");
// Wrapper 클래스 타입인 Integer 타입 변수 n1 선언
Integer n1 = new Integer(20); // Integer 인스턴스 생성하면서 파라미터로 정수 20 전달
// => Heap 영역의 Integer 인스턴스에 정수 20을 저장하고
// 해당 인스턴스 주소를 Stack 영역의 Integer 타입 변수 n1에 저장
Integer n2 = new Integer("200"); // Integer 인스턴스 생성 시 파라미터로 문자열 200 전달
// => 문자열 200을 정수형 데이터 200으로 변환하여 Integer 인스턴스에 저장
Integer n3 = Integer.valueOf(2000);
// Wrapper 클래스의 valuOf() 메서드를 호출하여 파라미터로 정수 2000 전달
// 주의! 정수데이터가 아닐 경우 타입 변환에 대한 오류가 발생할 수 있음!
// Integer n4 = new Integer("3.14");
// => double 타입 문자열의 경우 컴파일 에러는 없으나 실행 시 예외 발생!
System.out.println(n1);
System.out.println(n2); // n2.toString() 메서드 호출과 동일
System.out.println(n3.toString()); // 객체의 정보(실제 데이터)를 리턴하여 출력
// Integer 타입 변수 n1/2의 값을 출력하면 주소값이 아닌 실제데이터가 출력됨
// => toString() 메서드가 오버라이딩 되어 있으므로 저장된 실제 값을 리턴하도록 함
}
}package ex_wrapper;
public class Ex2 {
public static void main(String[] args) {
/*
* 박싱과 언박싱
*
* 기본 데이터타입은 Stack 공간에 실제 데이터 형태를 직접 저장 및 관리하지만
* 참조 데이터타입(객체)은 Heap 공간에 실제 데이터가 저장되며, 참조 변수가
* 해당 공간의 주소값을 저장 및 관리함
* => 따라서, 기본 데이터타입 변수와 참조 데이터타입 변수는 서로 호환 불가능했음
* 그러나, JDK 1.5부터 오토 박싱, 오토 언박싱 기능이 제공되면서 두 데이터타입 간에 자동으로
* 변환이 되도록 지원됨!
*
*/
// int형 기본 데이터타입 변수 num1 선언
int num1 = 10;
// Wrapper 클래스 타입인 Integer 타입 변수 n1 선언
Integer n1;
// 오토 박싱(Auto Boxing)
// Integer 타입 변수 n1에 int 타입 변수 num1의 값을 저장하려고 할 경우
// 1. 자바 초기에 사용하던 방법(Java 1.5 이전)
// => Wrapper 클래스타입 변수 = Wrapper클래스명.valueOf(기본형데이터 또는 변수);
// => 기본데이터타입을 Wrapper 클래스 타입 객체로 변환하여 저장
// n1 = Integer.valueOf(num1);
// System.out.println("기본데이터타입 num1 = " + num1);
// System.out.println("참조데이터타입 n1 = " + n1);
// 2. Java 1.5부터 사용 가능한 방법
// => Wrapper클래스타입 변수 = 기본형데이터 또는 변수;
// => 오토 박싱 기능에 의해 기본데이터타입 -> 참조데이터타입으로 변환되어 저장
n1 = num1; // int -> Integer 타입으로 자동으로 변환(= 오토 박싱)
System.out.println("기본데이터타입 num1 = " + num1);
System.out.println("참조데이터타입 n1 = " + n1);
System.out.println("========================================");
// 오토 언박싱(Auto Unboxing)
// 1. 자바 초기에 사용하던 방법(Java 1.5 이전)
// => 기본데이터타입변수 = Wrapper클래스타입변수.XXXValue();
// XXX은 자바의 기본데이터타입 이름(ex. intValue(), floatValue())
// int형 기본데이터타입 변수 num2 선언
int num2;
// num2 = n1.intValue(); // Integer 타입 -> int 타입으로 변환
// System.out.println("참조데이터타입 n1 = " + n1);
// System.out.println("기본데이터타입 num2 = " + num2);
// 2. Java 1.5 부터 사용 가능한 방법
// => 기본데이터타입변수 = Wrapper클래스타입변수;
// => 오토 언박싱 기능에 의해 참조데이터타입 -> 기본데이터타입으로 변환되어 저장
num2 = n1; // Integer 타입 -> int 타입으로 변환(자동으로 변환됨 = 오토언박싱)
System.out.println("참조데이터타입 n1 = " + n1);
System.out.println("기본데이터타입 num2 = " + num2);
System.out.println("========================================");
Integer n2 = 30; // 기본데이터타입을 Integer 타입으로 자동으로 변환하여 저장됨
Object o = n2; // Integer -> Object 타입으로 업캐스팅이 일어남(자동)
Object o2 = 30; // int -> Integer로 오토박싱되어 Object 타입으로 업캐스팅 됨
System.out.println(o2); // o2.toString() 생략됨(Integer 객체의 toString() 호출됨)
Object o3 = new Object();
System.out.println(o3);
System.out.println("========================================");
// 오토 언박싱이 일어나는 경우 => Wrapper 클래스타입과 기본데이터타입 연산 시
Integer n3 = new Integer(40);
int num3 = 60;
System.out.println(n3 + num3); // Integer -> int로 변환하여 연산에 참여함
// => 즉, Integer + int = int + int 형태로 연산됨
}
}
package ex_wrapper;
public class Ex3 {
public static void main(String[] args) {
/*
* 문자열 -> 기본 데이터로 변환
*
* < 기본 문법 >
* Wrapper클래스명.parseXXX(문자열변수 또는 리터럴);
* => XXX은 자바의 기본데이터타입 이름
* => ex) 정수형으로 변환할 경우 : Integer.parseInt("100");
* ex) 실수형으로 변환할 경우 : Double.parseDouble("3.14");
*
*/
String strNum = "3.14";
System.out.println(strNum + 10); // 문자열 데이터이므로 결합연산으로 동작함("3.1410")
// double 타입 변수 dNum에 문자열 실수 "3.14"가 저아된 strNum값을 저장
double dNum = Double.parseDouble(strNum);
System.out.println(dNum);
System.out.println(dNum + 10); // 실수형 데이터이므로 산술연산으로 동작함(13.14)
// 주의! 변환 후의 데이터타입과 일치하지 않는 데이터를 변환하려할 경우
// NumberFormatException 이라는 예외가 발생하여 변환되지 않는다!
int iNum = Integer.parseInt(strNum);
// => double 타입 데이터를 int형으로 변환할 수 없으므로 오류 발생!
}
}
package ex_wrapper;
public class Ex4 {
public static void main(String[] args) {
/*
* Wrapper 클래스의 다양한 메서드
* - Wrapper 클래스 타입을 활용하면 기본 데이터타입들을 다양하게 처리 가능
* - 주로 Wrapper 클래스의 static 메서드를 직접 호출하여 기본 데이터타입 데이터를
* 처리하도록 작업을 수행하는 형태로 사용
*
*/
// Integer 클래스의 static 메서드 활용
// 1. 두 정수에 대한 대소 관계 비교
int num1 = 10, num2 = 20;
int num3 = 30;
System.out.println("num1과 num2 중 큰 값 : " + Integer.max(num1, num2));
System.out.println("num1과 num2 중 작은 값 : " + Integer.min(num1, num2));
System.out.println("num1과 num2, num3 중 큰 값 : " + Integer.max(Integer.max(num1, num2), num3));
System.out.println("num1과 num2가 같은가 : " + (num1 == num2));
Integer n1 = num1; // 오토 박싱 적용
Integer n2 = num2;
System.out.println("n1과 n2가 같은가 : " + n1.equals(n2));
// 2. 어떤 정수에 대한 진법 변환
// => 해당 진법의 문자열 형태로 리턴하는 메서드를 사용 : toXXXString()
System.out.println("10진수 num1에 대한 2진수 변환 : " + Integer.toBinaryString(num1));
System.out.println("10진수 num1에 대한 8진수 변환 : " + Integer.toOctalString(num1));
System.out.println("10진수 num1에 대한 16진수 변환 : " + Integer.toHexString(num1));
System.out.println("=============================");
// Character 클래스의 메서드 활용
// => 주로 특정 문자에 대한 판별을 Character.isXXX() 메서드로 수행하거나
// 특정 문자로 변환을 Character.toXXX() 메서드로 수행
char ch = '!';
// 입력받은 문자 ch에 대한 대문자, 소문자, 숫자, 기타(특수문장 등)를 판별
// 1. 기본 데이터타입 형태에서 정수 범위를 사용하여 그대로 판별할 경우
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 + " : 기타문자!");
}
// 2. Character 클래스의 isXXX() 메서드를 호출하여 판별할 경우
ch = 'A';
System.out.println(ch + " 문자는 대문자인가? " + Character.isUpperCase(ch));
ch = 'a';
System.out.println(ch + " 문자는 소문자인가? " + Character.isLowerCase(ch));
ch = '0';
System.out.println(ch + " 문자는 숫자(0~9)인가? " + Character.isDigit(ch));
ch = ' ';
System.out.println(ch + " 문자는 공백문자인가? " + Character.isSpace(ch));
// => deprecated 처리된 메서드 : 사용은 가능하지만 보안 상의 이유나 다른 메서드 제공등으로 인해
// 현재는 사용하는 것을 추천하지 않는 메서드
// => 메서드 설명에 Deprecated. Replaced by isWhitespace(char). 표시됨
// isWhitespace() 메서드로 대체되었음을 알려주는 메세지
System.out.println(ch + " 문자는 공백문자인가? " + Character.isWhitespace(ch));
// 특정 문자 변환 -> 소문자로 변경할 경우
ch = 'A';
System.out.println(ch + " 문자를 소문자로 변경 : " + Character.toLowerCase(ch));
}
}