[ Java ]왜 Wrapper 클래스가 있는걸까?
프로그래밍에는 이유 없이 존재하는 것은 없다. 그렇다면 자바에서 wrapper 클래스는 왜 있는걸까??
기본형의 한계
자바는 객체 지향 언어이다. 그런데 자바 안에 객체가 아닌 것들이 있는데 그것은 바로 기본형이다.
기본형은 객체가 아니기 때문에 다음과 같은 한계가 있다.
- 객체가 아니다 : 기본형은 객체가 아니기 때문에 객체 지향 프로그래밍의 장점을 살릴 수 없다. 예를 들어 객체는 유용한 메서드를 제공할 수 있는데, 기본형은 객체가 아니므로 메서드를 제공할 수 없다.
- null 값을 가질 수 없다 : 때로는 데이터가 없음 이라는 상태를 나타내야 할 필요가 있는데, 기본형은 항상 값을 가지기 때문에 이런 표현을 할 수 없다.
기본형의 한계2
기본형과 null
기본형은 항상 값을 가져야 한다. 하지만 때로는 데이터가 ‘없음’이라는 상태가 필요할 수 있다.
객체의 경우 데이터가 없다는 null 이라는 명확한 값이 존재한다.
그렇다고 기본형의 값이 반드시 존재해야 한다는 제약이 나쁘다는 것이 아니다. 오히려 좋은 제약이다. 그러나 때로는 상황에 따라서 값이 없음을 표현하는 null 이라는 값이 필요할 수 있다는 것이다.
자바 래퍼 클래스
자바는 기본형에 대응하는 래퍼 클래스를 기본으로 제공한다.
자바가 제공하는 기본 래퍼 클래스는 다음과 같은 특징을 갖고 있다.
- 불변이다.
- equals로 비교해야 한다.
래퍼 클래스 생성 - 박싱
기본형을 래퍼 클래스로 변경하는 것을 마치 박스에 물건을 넣은 것 같다고 해서 박싱이라고 한다.
언박싱
래퍼 클래스이 들어있는 기본형 값을 다시 꺼내는 메서드이다.
박스에 들어 있는 물건을 꺼내는 것 같다고 해서 언박싱이라 한다.
비교는 equals() 사용
래퍼클래스는 객체이기 == 비교를 하면 인스턴스의 참조값을 비교한다.
래퍼 클래스는 내부의 값을 비교하도록 equals()를 재정의 해두었다. 따라서 값을 비교하려면 equals를 사용해야 한다.
참고로 래퍼 클래스는 객체를 그대로 출력해도 내부에 있는 값을 문자로 출력하도록 toString()을 재정의했다.
오토 박싱 - Autoboxing
개발자들이 오랜기간 개발을 하다 보니 기본형을 래퍼 클래스로 변환하거나 또는 래퍼 클래스를 기본형으로 변환하는 일이 자주 발생했다. 그래서 많은 개발자들이 불편함을 호소했다. 자바는 이런 문제를 해결하기 위해 자바 1.5부터 오토 박싱,오토 언박싱을 지원한다.
래퍼 클래스와 성능
래퍼 클래스는 객체이기 때문에 기본형보다 다양한 기능을 제공한다. 그렇다면 더 좋은 래퍼 클래스만 제공하면 되지 기본형을 제공하는 이유는 무엇일까?
CPU 연산을 아주 많이 수행하는 특수한 경우이거나 수만 수십만 이상 연속해서 연산을 수행해야 하는 경우라면 기본형을 사용해서 최적화를 고려해야한다.
그렇지 않은 일반적인 경우라면 코드를 유지보수하기 더 나은 것을 선택하면 된다.
특히 웹 애플리케이션의 경우 메모리 안에서 발생하는 연산 하나보다 네트워크 호출 한 번이 많게는 수십만배 더 오래 걸린다. 자바 메모리 내부에서 발생하는 연산을 수천번에서 한 번으로 줄이는 것보다, 네트워크 호출 한 번을 더 줄이는 것이 더 효과적인 경우가 많다. 권장하는 방법은 개발 이후에 성능 테스트를 해보고 정말 문제가 되는 부분을 찾아서 최적화 하는 것이다.