티스토리 뷰
Wrapper Class
◎ Define
- JAVA에는 데이터에 대한 타입이 존재한다. 그리고 이 데이터에 대한 타입은 기본형(Primitive Type)과 참조형(Reference Type)으로 나누어 진다. 기본형은 우리가 흔히 사용하는 int, long, double, char 와 같이 변수명 앞에 선언 해 주는 데이터 타입이고, 참조형은 기본형을 포장(Boxing)한 참조형(객체)이며, 기본형과는 다르게 Integer, Long, Double, Character 로 표기된다.
- Wrapper Class 라는 Class는 단지, 기본형(Primitive Type)을 참조형(Reference Type)으로 Wrap(포장, Boxing) 해서 사용하는 Class를 지칭하는 말로 Wrapper 라는 Class가 실제로 존재하는 건 아니다.
- 기본형은 실제 값을 가지고, 참조형은 실제 값을 가지고 있는 주소 값을 가진다.
◎ Wrapper Class Structure
◎ Explanation
① Wrapper Class에 대해서 좀 더 면밀히 알아보자.
참조)
Why? 왜 Wrapper Class 라는 것을 사용하는 것일까?
이와 같은 궁금증을 가지는 사람들이 많을 것이며, 그에 대한 답 또한 다양 할 것이다.
최대한 좁혀 보자.
1. 객체로 다루어야 될 상황
2. OOP 은닉화
3. null
1. 객체로 다루어야 될 상황
위에 나열된 이유 세 가지 중 가장 큰 비중을 차지할 것으로 보인다.
프로그래밍을 하다 보면 아주 무수히 많은 상황들에 직면하게 된다.
그 많은 상황들은 꼬리에 꼬리를 물고 늘어져 있을 것이며,
"객체로 다루어야 될 상황" 이라는 상황에 물린 꼬리들도 무수히 많을 것이다.
하지만 이 상황이 Wrapping을 하는 이유 중 가장 많고 큰 비중을 차지 할 것으로 본다.
말 그대로다. 프로그래밍이라는 게 더 직관적으로 더 깊숙히 추상적으로 파고 들어가면
정말 한도 끝도 없을 것이다.
그러므로 여기서는 간단하게 정리만 하겠다.
- null 이 필요한 상황
- 객체간 비교가 필요한 상황
- 객체만이 요구 될 때(ex : Generic)
2. OOP 은닉화
OOP? 어쩌면 생소하게 들릴 수도 있다.
하지만 우리가 JAVA라는 것을 시작 할 때 1000명 중 999명은 들었을 말이고
JAVA의 가장 큰 강점 중 하나이다.
바로 "객체 지향 프로그래밍 (Object-Oriented Programming)" 이다.
이 객체 지향 프로그래밍에서 강조하는 것 중 하나가 "은닉화(Hiding)" 즉, 숨길 것은 최대한 숨기자라는 말이다.
여기서 말하는 은닉이란.. 은닉화를 왜 하는 것인가?
물론 모든 개념을 다 알고 있다는 것과 일부 개념만 알고 있다는 것은 아주 큰 차이가 있을 것이다.
허나 인간은 완벽 할 수 없으며, 인간의 두뇌에도 용량이라는 한계가 존재한다.
용량에 과부하가 걸리는 일이 없도록, 수 많은 내용 중에서 가장 중요한 것들만 효율적으로 담자는 얘기다.
그럼 본론으로 돌아가서 그에 대한 답 역시 대표적인 것만 간단하게 서술하겠다.
- 외부에 노출하지 않아도 될 정보들을 숨기기 위해
- 외부에서 접근하는 것을 막아 잘못된 수정이 일어나는 것을 막기 위해
3. null
어떻게 보면 1번에 포함해도 될 것 같은 내용이지만 따로 설명하겠다.
여기서 null이 왜 중요한지 알아보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class WrapperClass { public static void main(String[] args) { String str1 = null; String str2 = ""; System.out.println("str1 : " + System.identityHashCode(str1)); System.out.println("str2 : " + System.identityHashCode(str2)); // result // str1 : 0 // str2 : 366712642 } } |
변수에 값을 넣는다(변수의 초기화)의 의미는 곧 "메모리에 공간을 차지한다"는 의미이며,
null은 "메모리 공간을 차지하지 않는다"는 의미이다.
참조형(Reference Type) 변수 str1은 선언만 되었을 뿐 "null" 상태이기 때문에
따로 메모리 공간을 차지하지 않아 참조형(Reference Type) 변수임에도 해당 변수의
주소(메모리에 저장된 값의 주소)값이 나타나지 않는 것이다.
필요한 곳에 null 을 사용한다면 메모리 공간을 좀 더 효율적으로 사용할 수 있을 것이다.
허나 ""로 빈 값을 가지고 있는 참조형(Reference Type) 변수 str2는 주소 값이 출력된다.
여기서 알 수 있는 것은 빈 값인 ""(blank, 쌍따옴표(double quotation))와 null은 엄연히 다르게 동작 된다는 것이다.
② Wrapper Class 박싱(Boxing)과 언박싱(Unboxing)에 대해서 알아보자.
◎ Wrapper Class Method
Method | Brief description |
boolean booleanValue() | 해당 객체의 값을 boolean으로 변환 후 반환 |
byte byteValue() | 해당 객체의 값을 byte로 변환 후 반환 |
double doubleValue() | 해당 객체의 값을 double로 변환 후 반환 |
float floatValue() | 해당 객체의 값을 float으로 변환 후 반환 |
int intValue() | 해당 객체의 값을 int로 변환 후 반환 |
long longValue() | 해당 객체의 값을 long으로 변환 후 반환 |
short shortValue() | 해당 객체의 값을 short으로 변환 후 반환 |
Object Method | Object Method |
1. Boxing : 기본형(Primitive Type)을 Wrapper Class의 객체, 참조형(Reference Type)으로 변환(포장)하는 과정
2. Unboxing : Wrapper Class의 객체, 참조형(Reference Type)을 기본형(Primitive Type)으로 변환하는 과정
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | public class WrapperClass { public static void main(String[] args) { // Boxing int int_num = 1; Integer w_num = new Integer(int_num); double double_num = 1.0; Double w_num2 = new Double(double_num); char character_cha = 'm'; Character w_cha = new Character(character_cha); boolean boolean_bool = true; Boolean w_bool = new Boolean(boolean_bool); // Unboxing int num = w_num.intValue(); double num2 = w_num2.doubleValue(); char cha = w_cha.charValue(); boolean bool = w_bool.booleanValue(); } } |
JDK 1.5 버전 이후부터 자동으로 Boxing과 Unboxing을 처리하도록 AutoBoxing과 AutoUnBoxing이 제공된다.
AutoBoxing & AutoUnBoxing
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | public class WrapperClass { public static void main(String[] args) { // AutoBoxing int int_num = 1; Integer w_num = int_num; double double_num = 1.0; Double w_num2 = double_num; char character_cha = 'm'; Character w_cha = character_cha; boolean boolean_bool = true; Boolean w_bool = boolean_bool; // AutoUnBoxing int num = w_num; double num2 = w_num2; char cha = w_cha; boolean bool = w_bool; } } |
AutoBoxing이 생기면서 반환 값에 대한 차이가 없어졌다.
그러므로 valueOf()든 parse?()든 뭘 쓴다고 해도 결과는 얻을 수 있고
데이터 타입마다 메서드가 나누어져 있는 parse?() 보단
모든 데이터 타입에 쓸 수 있는 valueOf()가 사용하기 편할 수도 있다.
단, 성능만 두고 보자면 valueOf() 가 조금 더 느리다.
'Java > Class' 카테고리의 다른 글
| [java.util] StringTokenizer (0) | 2018.01.08 |
|---|---|
| [java.lang] System (0) | 2018.01.05 |
| [java.lang] Math (0) | 2018.01.05 |
| [java.lang] StringBuilder (0) | 2018.01.04 |
| [java.lang] StringBuffer (0) | 2018.01.04 |
