티스토리 뷰

Java/Class

5. Wrapper Class

알 수 없는 사용자 2018. 10. 22. 02:13


이번 포스팅에서는

Wrapper 클래스에 대해서 

알아보도록 하겠습니다.

이번 내용은

단순하지만 다른 클래스 설계 시에

많이 사용되는 기능이기 때문에 알아두는 것이 좋습니다.


==================================================================


Wrapper Class






1. Wrapper Class : What?


 자바는 객체지향적 프로그래밍 언어입니다. 즉, 모든 것을 객체로 다루는 것을 지향한다는 것이죠. 하지만 자바에서는 8개의 기본형 데이터를 객체로 다루지 않고 사용했습니다. 그런점에서 자바는 완벽한 객체지향이 언어가 아니라는 평가를 듣긴 합니다. 물론 객체를 사용하지 않아 성능 측면에서는 그나마 높아졌습니다.


 하지만 자바에서도 기본 데이터형을 객체 타입으로 쓸 수 있고 객체 타입으로 다루어야만 하는 경우가 있습니다. 그때 사용되는 것이 Wrapper 클래스입니다.

마치, 특정 데이터와 기능을 모아서 만든 클래스를 단순히 기본 데이터형을 위한 클래스를 설계하고 그 안에 기본 데이터형 객체를 사용할 때 유용한 기능을 담아둔 것입니다.





2. Wrapper Class : When, Why?


 Wrapper 클래스는 보통 입문서를 기준으로 후반부에 나오는 문법이나 클래스에서 많이 사용됩니다. 


주로, 매개변수로 객체를 요구하고, 기본 데이터형이 아닌 객체로 저장해야 할 때, 객체 간에 비교가 필요할 때 등등의 경우에 Wrapper 클래스가 이용됩니다.

예를 들어 특정 객체를 한곳에 모아서 관리하기 편하게 하기 위해 제공되는 Collections Framework에서는 객체 형태만 다룰 수 있기 때문에 기본 데이터를 이용할 때는 데이터 형식에 따른 Wrapper 객체로 생성하여 이용합니다.


또한 문자열로 생성된 타입을 기본 데이터형으로 바꿀 때도 Wrapper 클래스가 사용됩니다.





3. Wrapper Class : How?


  Wrapper Class의 상속 계층도는 아래와 같습니다. 기본형 중 숫자와 관련된 Class는 모두 Number 클래스의 자손입니다.

 

[출처] https://way2java.com/java-lang/wrapper-classes/



  Wrapper 클래스도 각자의 생성자가 존재하기 때문에 new 연산자를 통해 데이터형에 따른 객체를 생성할 수 있습니다.


Boolean 객체를 생성하면 다음과 같이 new 생성자를 이용해 생성할 수 있습니다.

boolean b = true;
Boolean wb1 = new Boolean(b);
Boolean wb2 = new Boolean(b);
System.out.println(wb1 == wb2);

wb1과 wb2에 들어있는 boolean 값은 같더라도 Boolean은 하나의 객체이기 때문에 == 연산자로는 다른 객체로 인식하게 됩니다.



또한 new 연산자 없이도 생성할 수 있습니다.

Integer n1 = 4561;  
Integer n2 = 4561;
System.out.println(n1 == n2);

new 연산자없이 해당 타입의 값이나 문자, 문자열을 변수에 저장하는 것으로 Wrapper 객체가 생성됩니다.

이 또한 객체가 가지고 있는 값은 같지만 객체 자체는 새로운 인스턴스이기 때문에 다른 객체로 인식하게 됩니다.



마지막으로 Wrapper 객체에 정의된 static 메소드인 parseInt()와 valueOf()를 이용하여 객체를 생성할 수 있습니다.

해당 메소드는 각 타입에 맞게 모든 Wrapper 클래스에 정의되어 있습니다.

int r2 = Integer.parseInt("123");
int r3 = Integer.valueOf("123");


두 메소드의 기능의 목적은 같습니다. 문자열로 들어온 값을 int 형태로 바꾸어주는 것입니다. 

두 메소드의 차이는 parseInt()는 반환값이 기본 데이터형인 반면, valueOf()는 Wrapper 객체형이라는 것입니다.

parseInt()가 조금더 성능이 좋지만 오토박싱(Auto Boxing)과 오토언박싱(Auto Unboxing) 기능때문에 차이는 거의 없어졌습니다.






4. Wrapper Class : autoboxing & unboxing?


기본 데이터 형을 객체화하여 쓰려면 귀찮은 작업을 몇번이고 해야합니다. 때문에 자바에서는 오토박싱과 오토언박싱이라는 기능을 컴파일러가 자동으로 해줍니다.



위 코드에서 Integer객체를 생성하지 않고 valueOf()를 사용한 것을 보아 valueOf() 메소드는 static임을 알 수 있습니다.

public static Integer valueOf(String s) throws NumberFormatException {
return Integer.valueOf(parseInt(s, 10));
}


그런데 valueOf() 메소드의 반환값 타입은 Integer 객체입니다.

즉, Integer 객체를 반환하였는데 기본 데이터형 int 변수에 저장이 되었습니다.

이런 기능을 auto unboxing(오토언박싱)이라고 합니다. 

Integer 객체는 저절로 기본 데이터형으로 컴파일러가 자동으로 변환해주기 때문에 참조형과 기본형 간의 덧셈 연산도 가능합니다.


반대로 autoboxing은 우리가 생성자  없이 Integer 객체를 생성했을 때 볼 수 있었습니다.

Integer n2 = 4561;


단순히 int 형태의 숫자를 int형 변수에 저장하듯이 Integer 타입의 변수에 저장해도 저장이 되는 이유는 자동으로 int형 데이터가 Integer 객체를 생성해서 박싱되기 때문입니다. 이를 autoboxing이라 합니다.



 기본형과 참조형 간의 형 변환도 가능할 뿐만 아니라, 참조형 간의 연산도 가능합니다. 하지만 이 기능들은 컴파일러가 제공하는 편리한 기능일 뿐 자바의 원칙이 바뀐 것은 아니기 때문에 자바를 이제 공부하는 사람이라면 헷갈릴 수도 있습니다. 하지만 이러한 기능이 있고 어떻게 이루어지는지 정확히 알고 넘어가야 나중에 다룰 Collections Framework와 같은 부분에서도 이해하기 수월합니다.

'Java > Class' 카테고리의 다른 글

7. Collections Framework : Set  (0) 2018.10.25
6. Collections Framework  (0) 2018.10.23
4. 정규표현식(Regular Expression) : java.util.regex 패키지  (0) 2018.10.19
3. StringBuffer & StringBuilder  (0) 2018.10.18
2. String Class  (0) 2018.10.17
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함