티스토리 뷰

Java/기본기

[JAVA] Wrapper 클래스는 왜 있는 걸까?

Jason of the Argos 2021. 3. 5. 17:02

이번 글에서 정리하는 내용:

 

1. Boxing, unboxing, auto-boxing, auto-unboxing

2. Wrapper은 왜 생긴 걸까?

3. OOP를 추구하는 자바 언어 에선 Wrapper 클래스가 있는데 그럼 왜 primitive 자료형이 있는걸까?

 

2학년 시절 객체라는 개념이 잡히지 않았을 때 대충 같은거겠지 하면서 Wrapper, Primitive 구분하지 않고 막 썼다.

그러다가 여러차례 자바로 프로젝트를 하면서 객체란 대충 이런 구조로 작동하는구나 경험적으로 알아가던 중 평소엔 별 생각없이 넘어가던 부분이 매우 낯설게 보였다.

 

Integer instInt = 1;

 

이게 도대체 왜 되는거지? Integer은 Object인데 왜 new를 하지 않고도 사용할 수 있는걸까?

궁금증을 풀기 위해 이리저리 뒤지면서 Boxing, Unboxing, 그리고 Autoboxing, Auto-unboxing을 알게 되었다.

 

복습:

Boxing : primitive -> wrapper 바꾸는 과정

ex) Integer instInt = Integer.valueOf(i);

 

UnBoxing : wrapper -> primitive

ex) int primInt = instInt.intValue();

 

Auto-boxing : boxing을 명시적으로 변환하지 않아도 컴파일러가 자동으로 해줌

Auto-unboxing : unboxing을 명시적으로 변환하지 않아도 컴파일러가 자동으로 해줌

 

여기까지가 학부 생활을 하면서 알게 된 내용이다.

 

최근에 코딩테스트 문제를 몇 개 풀다가 시간 단축을 고민하던 중 Wrapper와 primitive 차이에 대해 고민하기 시작했다.  당연히 객체화하는 Wrapper가 더 오래 걸리겠지만 얼마나 더 오래 걸릴까? 찾아본 자료에 의하면 5배나 오래 걸린다고 한다. Autoboxing으로 코드 작성할 때는 매우 편리해졌지만, 무분별하게 autoboxing을 남용하면 퍼포먼스에 영향을 줄 수 있다는 얘기. (출처: dzone.com/articles/java-performance-notes-autoboxing-unboxing)

 

그러면 이 느린 Wrapper 클래스는 왜 생긴 걸까? 

객체지향 프로그램의 장점을 활용할 수 있기 때문이다. 기본 자료형을 객체처럼 다루게 될 때 그 객체를 구현하는 메소드에서 추상화된 상태로 parameter로 넘겨줄 수 있게 되고, 함수에서 구체화 시킬 수 있다(반대로 primitive타입은 이것이 불가능하다. pass-by-value 이기 때문에).

(출처: https://www.tutorialspoint.com/why-do-we-need-a-wrapper-class-in-java)

 

물음에 대한 답변은 다 찾은 것 같았지만 여전히 뭔가 찝찝한 느낌이 남아있었다. 고민하다가 진짜로 내가 알고 싶어 하는 궁금증을 찾았다.

애초에 객체지향을 추구하는 자바에서 왜 primitive 자료형이 있는걸까? 기본 자료형까지 모두 Object 기반으로 하면 되는거 아닌가?

 

여러 자료들을 찾아본 결과 꽤 그럴듯한 답변을 찾았다.

 

자바의 원형인 Oak가 원래 임베디드 언어로 사용될 것을 염두하여 만들어진 언어이기 때문에 퍼포먼스적인 측면을 고려하여 primitive 타입들을 사용한 것이고, 자바에 아직까지 남아있는 것이다. (primitive 타입이 있어서 유용한 면도 있고)

자바는 현재 스프링 등 서버 언어로 굉장히 많이 쓰이고 있지만, 처음 설계 되었을 때 당시 지금 상황을 의도하여 만들어진 언어가 아니다. 만약 그랬었다면 지금 사용하고 있는 primitive는 아마 없지 않았을까?

 

(출처: https://stackoverflow.com/questions/63294950/what-is-the-real-difference-between-primitives-and-wrapper-classes-in-java)

 

 

'Java > 기본기' 카테고리의 다른 글

[JAVA8] 6. Optional  (0) 2022.04.17
[JAVA 8] 3. 스트림의 기본  (0) 2022.03.13
[JAVA 8] 1. 동작 파라미터화  (0) 2022.02.19
[JAVA] Java는 정말 WORA할까?  (0) 2021.08.11
[Java 기본] I-1. JVM이란 무엇인가  (0) 2021.07.13