자료형의 효율적인 관리와 자료형은익화를 위해 만들어진 자료형 대체 클래스이다.
OOP의 개념중에 은닉화라는 개념이 있는데 숨길수 있는것은 최대한 숨기자는 뜻.
(Infomation Hiding Encapsulation
내부의 데이타는 외부로 부터 고립되었다. 데이타는 필요한 때에 단지 외부로부터의 Message에 의해서만
접근되어질 수 있는데, 이러한 것을 정보 은닉이라 한다. 만약 Object내의일부분을 수정하였다고 해도
그 변화는 단지 Object내에서만 영향을 끼치고, 이로 인하여 완전히 모듈화가 이루어지는 것이다.)
그러나 숨겨도 그형태를 쉽게 알아볼수 있는 타입이 있는데 바로 기본 자료형이다.(메모리의 바이트수만보면 대충짐작이 가능)
그래서 완벽한 은닉화를 위해 기본자료형을 대체할 class를 만들었고 이를 wrapper class라 한다.
wrapper class는 메모리를 보면 모두 4byte로 보이게 된다.
boolean => Boolean
char => Character
byte => Byte
short => Short
int => Integer
long => Long
float => Float
double => Double
import방법은 import java.lang.*;
//===========================================================================정의
1. Integer클래스
ex)
public class Test{
public static void main(String[] args) {
String str = "2147483648";
int x = Integer.parseInt(str);
x+=2;
System.out.println(x);
}
}
만약 문자로 위와같은 숫자를 받았을경우 10진수가 아닌 다른수로 어떻게 변환할까? int형으로 캐스팅 후
계산해도 되겠지만 수가 커질수록 당혹스러울것이다. 불편할것이다. 그래서 wrapper class가 필요한것이다.
2. 오토박싱, 오토언박싱
JDK 5.0에서 지원하는 방식
오토박싱 : 값형식 변수인 기본 자료형이(int....) 레퍼언스 형식 변수인 wrapper 클래스형(Interger)으로 변환하는것.
스택상의 메모리 공간에 있던 값을 힙상의 객체를 생성하여 복사하는것
오토언박싱 : 오토박싱과는 반대로 힙영역을 스택영역으로 복사하는것
1.4에서는 xxxValue()메소드를 이용해서 변환했지만 1.5부터는 바로 변환이 가능해졌다.
ex1)
Integer object = new Integer(12000); //오토박싱
int num = object.intValue(); //오토언박싱
ex2)
public class Test {
public static void main(String[] args) {
new Test().testInteger();
}
public void testInteger() {
int a = 1;
int b = 1;
Integer c = new Integer(1);
Integer d = new Integer(1);
System.out.println("1번 a == b : "+(a == b)); //true
System.out.println("2번 c == d : "+(c == d)); //false
System.out.println("3번 c.equals(d) : "+c.equals(d)); //true
System.out.println("4번 a == c : "+(a == c)); //true 오토언박싱이 되면서 wrapper class의 값을 꺼내어
//프리미티브타입으로 변형
//================================================================
String q = "TEST";
String w = "TEST";
String e = new String("TEST");
String r = new String("TEST");
System.out.println("5번 q == w :"+(q == w)); //true
System.out.println("6번 q.equals(w) :"+q.equals(w)); //true
System.out.println("7번 e == r :"+(e == r)); //false
System.out.println("8번 e.equals(r) :"+e.equals(r)); //true
}
}
3. Long 클래스
ex)
class Test{
public static main(String[] args){
Long num = new Long(10);
String strN = "10";
}
}
//parsexxx : 문자열에 해당하는 값을 해당 기본 자료형으로 변경한다.
long ss = Long.parseLong(strN);
//문자열에 해당되는 값을 해당 Wrapper클래스형 객체로 변경한다.
Long num2 = long.valueOf(strN);
4.Character 클래스
Character.isDefined(문자데이터) :문자데이터가 유니코드 이면true
Character.isDigit(문자데이터) :문자데이터가 숫자 이면true
Character.isLetter(문자데이터) :문자데이터가 문자이면true
Character.isLetterOrDigit(문자데이터) :문자데이터가 숫자나 문자이면true
Character.isLowerCase(문자데이터) :문자데이터가 소문자 이면true
Character.isSpace(문자데이터) :문자데이터가 공백 이면true
Character.isUpperCase(문자데이터) :문자데이터가 대문자 이면true
Character.toLowerCase(문자데이터) :문자데이터를 소문자로 변형
Character.toUpperCase(문자데이터) :문자데이터를 대문자로 변형
//=====================================wrapper class는 언제 써야하는가?
1 기본 데이터 타입을 객체로 혹은 다른 타입으로 변환을 위한 목적
2 wrapper class를 이용하지 않고도 자료형간의 변환은 가능하나 간단하고 직관적인 경우,
굳이 wrapper class를 쓰지 않고 그냥 구현하는 것이 더 빠를 수 있다.
허나 가독성면에서 wrapper class를 사용하면 깔끔해지므로 wrapper class를 사용하는게 낫다고 생각된다.
3 내부구조나 동작을 감추거나 편의를위해 인터페이스를 제한하기위한 도구로 활용.