Wrapper Class
: 자바의 8가지 기본 자료형은 단순히 값을 저장하는 기능만 있지만 Wrapper 클래스로 다양한 기능을 사용할 수 있다.
자바의 기본 자료형은 객체지향 프로그램에서 사용되는 객체와는 다른 차원의 개념이다.
객체는 속성과 행위를 포함하고 있지만, 기본자료형은 속성만 표현하기 때문에 처리하는데 한계가 있다.
단지 연산자를 이용한 연산만 수행할 수 있다.
이런 제한을 보강하기 위해 만들어진 것이 Wrapper 클래스이다. Wrapper 클래스를 사용하면 자료형을 여러 가지 형태로 처리할 수 있다. 소문자를 대문자로 변환, 정수를 문자열로 변환, 문자열을 정수로 변환 등과 같은 부가적인 처리를 할 수 있어서 Wrapper 클래스를 Data Type Wrapper라고 부른다.
자바의 Primitive Type(기본형) 변수도 때로는 객체로 다루어져야 하는 경우도 있다.
예를 들면 매게 변수로 객체를 요구할 때 등 기본형이 아닌 객체로 저장해야 할 때, 객체 간의 비교가 필요할 때 등의 경우에 기본값들을 객체로 변환해서 작업을 수행해야 한다. 이때 사용되는 것이 Wrapper 클래스입니다.
기본자료형은 단순이 값을 저장하는 기능만 있지만 Wrapper 클래스는 객체이므로 다양한 기능을 사용할 수 있다.
기본형은 속성만 가지고 wrapper class는 속성과 행위를 할수있는 메소드를 가진다.
< 종류 >
기본자료형 | Wrapper 클래스 |
boolean | Boolean |
byte | Byte |
char | Character |
float | Float |
int | Integer |
short | Short |
long | Long |
void | Void |
▶▶Integer
(예제) - Integer
public class Wrapper_1 {
public static void main(String[] args) {
Integer one = new Integer("345");
Integer two = new Integer(45);
int total = one.intValue() + two.intValue(); // int형으로 반환해줌
String totalString = one.toString() + two.toString(); //String으로 반환
//one +two 변환 없이 하면 390이 나온다. 하지만print()안에 다른글,String이 있다면 문자로취급됨
System.out.println("one : " + one.intValue() + ", tow : " + two.intValue());
System.out.println("one : " + one + ", tow : " + two);
System.out.println("one+two : " + total);
System.out.println("one.toString()+two.toString : " + totalString);
System.out.println(total + ">>2진수 : " + Integer.toBinaryString(total));
System.out.println(total + ">>8진수 : " + Integer.toOctalString(total));
System.out.println(total + ">>16진수 : " + Integer.toHexString(total));
System.out.println(Integer.TYPE);
}
}
객체화해 두면 여러가지로 변형해서?? 사용할수있기 때문에 이렇게 변형해서 사용하는 경우가 있다.
[오토박싱과 언박싱]
언제 오토박싱과 언박싱을 사용해야할까?
래퍼런스 타입과 기본타입 사이의 "임피던스 불일치가"가 있는 경우에만 사용하자.(기본타입을 쓸수 없는 경우)
예를들어 Map 이나 Set같은 Java Collection에는 기본타입을 못 넣으니까 이런경우에는 레퍼런스타입을 쓰면된다.
하지만 과학계산이나, 성능에 민감한 계산코드에 오토박싱, 언박싱을 사용하는건 적절하지 않다.
Integer는 int 를 완벽히 대체할 수 없다.
오토박싱과 언박싱은 기본타입과 레퍼런스 타입 사이의 구분을 흐릿하게 만들어 주지만
그차이를 완벽히 없애는 것은 아니다.
박싱 - 기본형이 class인 Intger로 들어가는것
언박싱 - Wrapper class 가 기본형으로 나오는것 (변환되는것)
(예제)
public class Wrapper_2 {
public static void main(String[] args) {
Integer abc_1 = new Integer(789);
Integer abc_2 = new Integer(456);
int kbs_1 = (int) abc_1; // UnBoxing(Wrapper class가 기본형으로 나오는것(변환하는것))
int kbs_2 = abc_2; // Auto UnBoxing
Integer bbc_1 = (Integer) 345; // Boxing(기본형(int)이 클래스(Integer)로 들어가는것)
Integer bbc_2 = 589; // Auto Boxing
Integer king_1 = abc_1 + abc_2; // Wrapper 끼리 연산
Integer king_2 = kbs_1 + kbs_2; // 기본형끼리 연산 후 Auto Boxing
int queen_1 = abc_1 + kbs_1; // 기본형과 Wrapper형 연산
System.out.println("abc_1 : " + abc_1);
System.out.println("abc_2 : " + abc_2);
System.out.println("kbs_1 : " + kbs_1);
System.out.println("kbs_2 : " + kbs_2);
System.out.println(" bbc_1 : " + bbc_1);
System.out.println(" bbc_2 : " + bbc_2);
System.out.println("king_1 : " + king_1);
System.out.println("king_2 : " + king_2);
System.out.println("queen_1 : " + queen_1);
}
}
(예제) - Integer
public class Wrapper_3 {
public static void main(String[] args) {
Integer kbs_1 = new Integer(300);
Integer mbc_1 = new Integer(300);
System.out.println("kbs_1 == mbc_1 : " + (kbs_1 == mbc_1));//주소값비교
System.out.println("kbs_1.equals(mbc_1) : " + (kbs_1.equals(mbc_1)));//내용비교
//hashCode 값을 비교한다.
System.out.println("kbs_1.toString() : " + kbs_1.toString());
System.out.println("mbc_1.toString() : " + mbc_1.toString());
System.out.println("Integer.MAX_VALUE : " + Integer.MAX_VALUE);
System.out.println("Integer.MIN_VALUE : " + Integer.MIN_VALUE);
System.out.println("Integer.SIZE : " + Integer.SIZE + "bits");
System.out.println("Integer.TYPE : " + Integer.TYPE);
System.out.println("hashCod : " + kbs_1.getClass().hashCode());
System.out.println("hashCod : " + mbc_1.getClass().hashCode());
}
}
(예제)
public class Wrapper_4 {
public static void main(String[] args) {
// 문자열을 두가지방법으로 숫자화(10진수) 하고있다.
//방법1
int abc = new Integer("789").intValue();
//방법2
int bcd = Integer.parseInt("678"); // 문자열을 숫자화하는데 기본형int로 리턴
Integer cde = Integer.valueOf("567"); // 문자열을 숫자화하는데 리턴타입은 Wrapper class의 Integer
int int_1 = Integer.parseInt("100", 2);// ("숫자", 2진수로리턴) 안쓰면 기본은 10진수
int int_2 = Integer.parseInt("100", 8);
int int_3 = Integer.parseInt("100", 16);
// int int_4 = Integer.parseInt("FF"); 런타임에러가뜸. FF는16진수로 바꿔야지 됨 10진수안됨
int int_4 = Integer.parseInt("FF", 16);
Integer integer_1 = Integer.valueOf("100", 2);
Integer integer_2 = Integer.valueOf("100", 8);
Integer integer_3 = Integer.valueOf("100", 16);
// Integer integer_4 = Integer.valueOf("FF");
Integer integer_4 = Integer.valueOf("FF", 16);
System.out.println(abc);
System.out.println(bcd);
System.out.println(cde);
System.out.println("100(2) : " + int_1);
System.out.println("100(8) : " + int_2);
System.out.println("100(16) : " + int_3);
System.out.println("FF(16) : " + int_4);
System.out.println("100(2) : " + integer_1);
System.out.println("100(8) : " + integer_2);
System.out.println("100(16) : " + integer_3);
System.out.println("FF(16) : " + integer_4);
}
}
int형으로 나타내던 Integer (wrapper class) 모양으로 나타내던 값은 같다.
둘의 차이점은 기본형인 int는 속성(즉 값, 표현범위 등)만을 가지지만
Integer은 속성과 어떠한 행위를 할수있는 메소드도 함께 가진다는 차이점이 있다.
▶▶ Charactor
(예제) args[] 를 이용하여 문자를 판별하는 방법
package ja_0725;
//Runconfigurations... 에서 프로그램 아규먼트에 적는 것이 args[] 배열에 들어가고
//한칸 띄우기(스페이스바)하면 다음번 인덱스에 값이 들어감.
public class Wrapper_5 { // 런- 아규먼트에서 kor456@#$ 적어주었다.
public static void main(String[] args) {
char obj[] = new char[args[0].length()];
// 내가kor456@#$ 적어서 9개를 담을수 있는 공간이만들어짐.
args[0].getChars(0, args[0].length(), obj, 0);
// args[0]에서 char을 가져오겠다. 0번부터~길이만큼 가져와서 obj에 0번부터 집어넣겠다.
// 아무것도 대입 안해주면 그 인덱스는 공백이다.
for (int i = 0; i < obj.length; i++) {
System.out.println("입력된 문자 [" + obj[i] + "] :");
if (Character.isDefined(obj[i]))
System.out.println(" 유니코드입니다.");
if (Character.isDigit(obj[i]))
System.out.println("숫자입니다.");
if (Character.isLetter(obj[i]))
System.out.println(" 문자입니다.");
System.out.println("====================================");
}
}
}
입력된 문자 [k] :
유니코드입니다.
문자입니다.
====================================
입력된 문자 [o] :
유니코드입니다.
문자입니다.
====================================
입력된 문자 [r] :
유니코드입니다.
문자입니다.
====================================
입력된 문자 [4] :
유니코드입니다.
숫자입니다.
====================================
입력된 문자 [5] :
유니코드입니다.
숫자입니다.
====================================
입력된 문자 [6] :
유니코드입니다.
숫자입니다.
====================================
입력된 문자 [@] :
유니코드입니다.
====================================
입력된 문자 [#] :
유니코드입니다.
====================================
입력된 문자 [$] :
유니코드입니다.
====================================
▶▶ Boolean
(예제)
package ja_0725;
public class Wrapper_6 {
public static void main(String[] args) {
Boolean bool_1 = new Boolean(true);
Boolean bool_2 = new Boolean("345");
Object bool_3 = new Boolean("TruE"); // True라는 글자이외에는 String타입은 모두false
// 대소문자 상관 없음.
if (bool_1.booleanValue()) { // booleanValue() : bool타입의 값(T/F)을 반환해줌
System.out.println("boo1_1 객체는 true입니다.");
} else {
System.out.println("boo1_1 객체는 false입니다.");
}
if (bool_2.booleanValue()) {
System.out.println("boo1_2 객체는 true입니다.");
} else {
System.out.println("boo1_2 객체는 false입니다.");
}
if (((Boolean) bool_3).booleanValue()) {
// Object는 booleanValue() 메소드가 없다. 그러므로 Boolean으로 형변환해줌
System.out.println("boo1_3 객체는 true입니다.");
} else {
System.out.println("boo1_3 객체는 false입니다.");
}
}
}
(예제) - 메소드를 이용하여 문자인지, 소/대문자인지 등을 판별하는 방법
package ja_0725;
public class Wrapper_7 {
public static void main(String[] args) {
char[] obj = { '1', 'a', ' ', '#', 'B' };
for (int i = 0; i < obj.length; i++) {
System.out.println("\n문자 [" + obj[i] + "] : ");
if (Character.isDefined(obj[0])) {
System.out.println("유니코드입니다.");
}
if (Character.isDigit(obj[i])) {
System.out.println("숫자입니다.");
}
if (Character.isLetter(obj[i])) {
System.out.println("문자입니다.");
}
if (Character.isLowerCase(obj[i])) {
System.out.println("소문자 입니다.");
}
if (Character.isUpperCase(obj[i])) {
System.out.println("대문자 입니다.");
}
if (Character.isSpace(obj[i])) {
System.out.println("공백 문자 입니다.");
}
if (Character.isAlphabetic(obj[i])) {
System.out.println("알파벳 입니다.");
}
}
}
}
▶▶ Byte
package ja_0725;
public class Wrapper_8 {
public static void main(String[] args) {
int bb_data = 0;
Byte bb = new Byte("111"); // 문자열을 받아서 숫자화 하겠다
// -128 ~ 127 표현가능
bb_data = bb.byteValue() + Byte.MAX_VALUE; // 238(int bb_data이니까 오버플로우 없이 나옴)
Byte bb_2 = (byte) (bb.byteValue() + Byte.MAX_VALUE);// -18(Byte여서 오버플로우 발생)
System.out.println("bb.byteValue() + Byte.MAX_VALUE :" + bb_data);
System.out.println("(byte)(bb.byteValue() + Byte.MAX_VALUE : " + bb_2);
Byte bbb = 0;
// wrapper class 인 Byte이거나 기본형byte이여도 결과는 같게나옴. 똑같이 오버플로우발생
int ii = 0;
for (int i = 0; i < 300; i++) {
System.out.println("Byte : " + ++bbb + ", int : " + ++ii);
}
}
}
▶▶ Short
package ja_0725;
public class Wrapper_9 {
public static void main(String[] args) {
int ss_data = 0;
short max = Short.MAX_VALUE; //오토언박싱 (클래스가 기본형으로 변환)
short min = Short.MIN_VALUE;
//Short max/ min 해도 최대값 최소값은 동일하다.
//기본형은 속성만 가지고 wrapper class는 속성과 행위를 할수있는 메소드를 가진다.
Short ss = new Short("888");
ss_data = ss.shortValue();
// int sss_data = new Short("999").shortValue();
System.out.println("\t ss_data : " + ss_data + "\n\t 최대값 : " + max + "\n\t 최소값 : " + min);
}
}
▶▶ Float
package ja_0725;
public class Wrapper_10 {
public static void main(String[] args) {
Float one = new Float("234.345f");
System.out.println("현재 값 : " + one);
System.out.println("byte 값 : " + one.byteValue());
System.out.println("short 값 : " + one.shortValue());
System.out.println("int 값 : " + one.intValue());
System.out.println("long 값 : " + one.longValue());
System.out.println("float 값 : " + one.floatValue());
System.out.println("double 값 : " + one.doubleValue());
System.out.println("NaN 체크 : " + one.isNaN());
// NaN = not a number 숫자인데 숫자가아니다 라고 판별하니까 f나옴
System.out.println("무한대 체크 : " + one.isInfinite());
}
}
▶▶ Double
package ja_0725;
public class Wrapper_11 {
public static void main(String[] args) {
Double one = new Double("10");
double two = 3;
double result = one.doubleValue() / two;
System.out.println("result : " + result);
System.out.println("NaN 체크 : " + Double.isNaN(result));
System.out.println("무한대 체크 : " + Double.isInfinite(result));
System.out.println("Double 최대값 : " + Double.MAX_VALUE);
System.out.println("Double 최소값 : " + Double.MIN_VALUE);
}
}
'KH > JAVA' 카테고리의 다른 글
# 33 StringBuffer , StringTokenizer (0) | 2022.07.27 |
---|---|
# 32 String (0) | 2022.07.25 |
# 29 동기화( Synchronization ) / ATM 만들기 (0) | 2022.07.22 |
# 28 Thread (쓰레드) (0) | 2022.07.20 |
# 27 Exception Handling( 예외 처리 ) (0) | 2022.07.20 |