Java

[Java]Wrapper class - part.1

MoZZANG 2022. 3. 8. 19:25

Wrapper class란?

기본형의 값을 참조형으로 사용해야 하는경우 사용되는 클래스를 의미하며 기본형의 값을 참조형으로 포장한다는 의미로 WARAPPER 클래스라 부른다.

JDK1.4이전 버전에서는 엄격하게 구분 되었으나 JDK5.0 이상 버전에서는 auto-boxing및 auto-unboxing지원으로 쉽게 변환 가능하다.

 

Auto-boxing : 기본 자료형이 자동으로(auto) 참조형(wrapper클래스)으로 바뀌는 것

                   ex.) int -> Integer

Auto-unboxing : 참조형(Wrapper클래스)이 기본자료형으로 자동으로 바뀌는 것

                   ex.) Integer -> int

 

 

▲ int형인 num1을 num1Obj이라는 int형 클래스인 Integer클래스로 auto-boxing하였다.

    Integer 클래스인 num10Obj를 int형 변수 num3로 auto=unboxing 하였다.

    물론 마지막 행처럼 int형 변수가 아닌 상수 즉, int값을 직접 Integer클래스로 만들 수도 있다.

 

 

▲ 각 기본자료형들의 Wrapper클래스 형태

 

 

 

그렇다면 왜 Wrapper클래스를 사용하는 것일까?

int형 같은 기본 자료형은 가진 method가 없다. 하지만 Class형들은 모든 클래스의 조상인 Object라는 클래스가 가지고 있는 많은 기능들 즉, method 즉, 함수들을 사용할 수가 있기 때문이다.

 

그러니까 우리는 기본 자료형을 클래스형으로 boxing시켜서 기본자료형에도 클래스안에 있는 수많은 기능들을 적용시키기 위해 사용하는 것이다.

 

 

 

▲ 클래스형에 ' . '을 붙여 메소드들을 사용할 수 있다. 

   3행에서 처럼 int형 상수인 num1을 int형 클래스를 사용해서 쉽고빠르게 8진수로 바꿀 수 있다.

 

 

 

▲ 첫행에서 Integer형 remodel이라는 이름의 메모리에 heap영역에 생긴 메모리 99가 저장된 메모리의 주소가 저장되어야 할 것으로 예상된다. 하지만 결과는 아래와 같다.

 

▲ 분명 클래스형 메모리에는 데이터값이 저장될 수 없고 주소값이 저장되어야 하므로 출력하면 주소값이 나와야 하는데 데이터값이 나온다. 왜그럴까?

 

 

바로 Overriding이라는 개념 때문에 그렇다. 자바의 모든 클래스들은 Object라는 최상위 클래스로부터 상속받는다. Wrapper클래스들은 Object로부터 상속받은 메소드를 오버라이딩 하여 인스턴스변수 출력시 주소가 아니라 실제 저장된 값이 반환되도록 오버라이딩 된 것이다. 물론 모든 메소드들이 오버라이딩 되는 것은 아니다. 위 예제에서는 toString이 오버라이딩된 메소드인 것이다.

 

오버라이딩은 쉽게 생각해서 리모델링 같은 것이다. 원래의 기능을 버리고 새로운 기능으로 바뀌는 것이다. 원래 Object라는 최상위 클래스에서 toStirng()은 원래 '클래스명@16진수 주소' 형태로 반환하는 메소드이다. 하지만 Wrapper클래스에서 사용하므로써 오버라이딩이 되어 해당 메모리의 데이터값이 출력되는 기능으로 바뀐 것이다.

 

2행에서는 이미 Integer형인 remodel의 값을 출력하게되는 것이므로 .toString()이 생략되어 있는 것과 마찬가지이다.

 

마지막행의 hashCode()또한 원래의 기능은 주소를 보여주는 메소드인데 여기서는 오버라이딩 된 것이다.

 

 

 

 

▲ tistory클래스형의 이름이 ts인 메모리를 선언과 동시에 인스턴스화 해주었다. 결과는 아래와 같다.

 

 

▲ 결과는 주소가 출력되는 것을 볼 수 있다. 내가 만든 클래스는 최상위클래스인 Object의 상속을 그대로 받기때문에 기존의 toString()메소드 기능에 충실하기 때문이다.

 

이처럼 오버라이딩이 되는 클래스의 메소드가 따로 있다는 것을 알 수 있다.

'Java' 카테고리의 다른 글

[Java]Wrapper class - part.3(Character)  (0) 2022.03.08
[Java]Wrapper class - part.2(Integer)  (0) 2022.03.08
[Java]Static block  (0) 2022.03.07
[Java]modifier part.2  (0) 2022.03.07
[Java]전역변수와 지역변수 & modifier  (0) 2022.03.07