티스토리 뷰

Java/Class

[java.lang] Wrapper

MinChyang 2018. 1. 5. 14:40

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
댓글
Notice
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
Link
«   2026/02   »
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
글 보관함