Language/Java

Wrapper class, Primitive type

Kim Jinung 2023. 5. 15. 13:57

Primitive type

int, char, boolean 등이 그 예시다. 원시 타입의 가장 큰 특징은 다음과 같다.

 

  1. null 값을 가질 수 없다.
  2. 값 그 자체다.

Wrapper class

래퍼 클래스(Wrapper class)의 메커니즘은 원시 타입을 객체로 변환하는 것이다. 따라서 다음과 같은 특징을 가진다.

 

  1. null 값을 가질 수 있다.
  2. 객체를 참조하는 값을 가지고 있다.

Why?

왜 굳이 원시 타입을 래핑하는 래퍼 클래스가 별도로 존재할까?

 

개인적인 추측으로는 자바가 객체 지향 프로그래밍 언어이기 때문이라고 생각한다. 함수형 프로그래밍 언어는 값을 함수의 파라미터로 넘긴다. 범위는 지정하지 않는다. 값을 넘기면 Call by value에 기반하여 계산하고 그 결과를 반환한다. 이때 결과는 파라미터에 넘어온 값에는 영향을 주지 않는다. 반면에 객체 지향은 말 그대로 객체 간 협력을 통해 시스템을 구성하는 패러다임이다. 그러므로 메서드의 파라미터로 객체의 참조 값을 주고 받게 된다. 이때 원시 타입은 값 자체를 복사 하므로 원본 값에 영향을 줄 수 없다. 이는 객체지향 패러다임에 적절하지 않다. 이를 래퍼 '클래스'로 변환하고 값을 변경하면 객체 지향 패러다임 다운 방식으로 오리지널 값을 변경할 수 있다. 주의할 점은 자바에서 클래스를 넘기더라도 Call by reference가 아니다. 자바는 기본적으로 Call by value만 지원한다. 이는 자바 언어 설계 시 안전성을 중요시했기 때문이다. (자바에는 포인터가 없다. 포인터는 보안을 해칠 수 있기 때문이다.)

 

위 내용에서 객체를 넘기는 게 왜 Call by reference가 아니라 Call by vlaue인지 굉장히 헷갈리는데, 이는 자바 JVM이 메모리 영역을 어떻게 사용하는지 먼저 이해해야한다. 

 

자바는 객체를 힙(Heap) 메모리 영역에 저장한다. 그리고 해당 객체를 가리키는 Reference(참조)는 Thread stack에 저장한다. 이 참조 값은 객체가 저장되어 있는 힙 메모리 주소를 가리킨다. 즉 참조 값은 힙 메모리에 저장된 오리지널 객체의 주소를 가리키는 값이고, 이 참조값이 변수에 할당 된다. 그러므로 메서드에 이 참조 값을 넘기면 Call by value 방식으로 참조 값을 복사한다. 이때 복사하더라도 힙 메모리 영역을 가리키는 주소는 동일하다. 이 복사된 참조값을 이용해서 힙 메모리 영역에 접근하는 방식으로 오리지널 객체의 필드를 변경한다.


Autoboxing, Unboxing

Autoboxing

원시 타입을 래퍼 클래스로 변경하는 예시는 다음과 같다.

int a = 20;

Integer result = Integer.valueOf(a);


// After java 5 - autoboxing
Integer resultByAutoboxing = a;

각 래퍼 클래스는 valueOf 메서드를 제공해서, 원시 타입을 객체 기반의 래퍼 클래스로 변환해주는 메서드를 가진다. 그리고 자바5 버전에서는 해당 과정을 더 편하게 변환해주는 autoboxing 기능을 제공한다. (해당 기능은 컴파일러가 알아서 처리한다.)

 

Unboxing

int i = a.intValue();

// Unboxing by Java compiler
int j = a;

unboxing도 마찬가지로, 래퍼 클래스는 원시 타입으로 변환해주는 ooValue() 메서드 시리즈를 제공한다. 자바5 이후로는 원시 타입에 래퍼 클래스를 할당하면 해당 작업을 컴파일러가 대신 해준다. 


Reference

 

https://www.javatpoint.com/wrapper-class-in-java

 

Wrapper class in Java - Javatpoint

Wrapper class in Java with concepts and examples of Byte class, Short class, Integer class, Long class, Float class, Double class, Boolean class and Character class.

www.javatpoint.com