티스토리 뷰

포스팅에 앞서 내용이 틀릴 수 있습니다.
해당 부분 지적 감사히 받습니다.

 

래퍼 클래스에 대해 알아보자.

 

래퍼 클래스 : 기본형 타입을 객체로 변환한 클래스

 

자바에서 int는 기본형이다.

 

기본형은 객체에 비해 한계가 명확하다.

 

1. 메서드를 제공할 수 없다.

 

2. 값없음(Null)을 사용할 수 없다.

 

자바에서는 null이 객체에만 들어갈 수 있다.

 

따라서 가끔 int 타입에도 값없음이 필요할 때가 있는데, 이를 해결하기 위해 Wrapper Class라는 것이 존재한다.

 

Wrapper Class라는 이름에서도 알 수 있듯이 Class이며 객체로 생성된다.

 

자바에서는 기본적으로 Wrapper Class를 제공한다.

 

Character()

 

Boolean()

 

Integer() -> 추가로 -128 ~127을 String Pool처럼 캐싱해서 갖고 있다.

 

Double()

 

Short()

 

Long()

 

Float()

 

Byte() 

 

앞글자가 대문자로 시작하는 것을 볼 수 있으며, 과거에 다루었듯 관례상 Class앞 첫 글자는 대문자로 시작한다.

 

제공되는 Wrapper Class는 String Class처럼 객체이기 때문에, 참조값을 통해 값에 접근하여 사용하여야 한다.

 

또한 불변 객체이며 동등성 비교는 equals()를 사용하여야 한다.( 내부에 들어가 보면 값으로 비교를 한다. 참조값 x)

 

래퍼 클래스와 기본형 사이에는 형변환이 가능하다.

 

이를 박싱, 언박싱이라고 한다.

 

박싱(boxing) : 기본형 -> 참조형

 

언박싱(un-boxing) : 참조형 -> 기본형

 

박싱은 기본형을 참조형(객체)으로 씌우는 것 같아서 boxing이라 하고, 반대는 벗겨내는 느낌이라 unboxing이다.

 

박싱/ 언박싱

Integer i = new Integer(10); //박싱
int i2 = i.intValue(); // 언박싱

 

위와 같은 방법으로 박싱과 언박싱이 이루어진다.

 

intValue() 함수는 래퍼 클래스의 메서드이며 객체 내부의 값을 int(래퍼 클래스마다의 타입)으로 반환한다.

 

하지만 위와 같이 사용하다 보면, 그냥 단순한 변수 하나 선언인데 뭔가 객체며, 메서드가 쓰인다.

 

이에 대한 편의성을 제공하기 위해 자바에서는 오토박싱, 오토언박싱을 제공해 준다.

 

사용예제를 보자.

int value = 5 ;
Integer i = value; //오토 박싱
int i2 = i; // 오토 언박싱

그냥 객체와, xxxValue() 필요 없이 위와 같이 사용하여도 자바는 자동으로 박싱, 언박싱 처리를 해준다.

 

 

추가적으로 자바가 오토 박싱과 언박싱을 어떻게 해주는지 코드로 보자

        int value = 5 ;
        Integer i = value; //오토 박싱
//      Integer i = Integer.valueOf(value); // 자바 컴파일러 추가

        int i2 = i; // 오토 언박싱
//      int i2 = i.intValue(); // 자바 컴파일러 추가

 

위와 같은 코드가 들어오면 주석처리 된 부분처럼 자바가 알아서 컴파일해 준다.

 

근데 자바가 컴파일 한 소스코드를 보니까 나의 자바 버전에서 오토 언박싱은 그냥 int i2 = i; 로 들어가더라.

 

버전마다 차이가 있을 수 있으니 참고하자

 

자바가 컴파일한 코드

int value = 5;
Integer i = Integer.valueOf(value);
int i2 = i;

 

 

추가적으로 컴퓨터 성능에 따라 다르지만, 기본형과 래퍼 클래스 사이의 계산속도는 약 5배 이상 차이가 난다.

기본형보다는 아무래도 객체가 차지하는 메모리 공간이 더 많이 때문에 이런 연산속도에서의 차이를 갖고 있다. ( int는 4바이트 차지하지만 Integer Class는 버전에 따라 대략 8~16 byte를 더 차지한다.)

 

sumPrimitive = 499999999500000000
기본 자료형 long 실행 시간 : 269
sumPrimitive2 = 499999999500000000
Wrapper Class Long 실행 시간 : 2252

 

1부터 10억까지 합 결과의 연산속도의 차이를 보여준다.

 

실행 시간 단위는 밀리세컨드이며, 내 컴퓨터의 경우 9배 정도의 속도 차이가 난다.

 

사실 10억 번의 연산인 것 치고는 2초면 많이 크진 않다.( 크긴 함 )

 

김영한 선생님께서는 만약 래퍼 클래스의 사용으로 코드 가독성이 떨어지게 된다면, 그냥 최적화 보다 유지보수가 쉬운 코드를 작성하라고 추천해 주신다.

 

실무에서는 이런 연산에서의 성능차이보다는 차라리 외부 네트워크 호출의 개수를 줄이라고 하셨다.

 

외부 네트워크 호출 1개가 1회 연산보다 많으면 수십만 배 오래 걸리니..

 

다만 나는 회사에서 배치 프로그램 또한 다루고 있으니, 효율적인 메모리 관리에 대해서도 더 알아보고 싶다.

 

자바보다는 쿼리에서의 효율이 더 우선시되겠지만.

댓글