개인적으로 공부하며 정리한 내용으로 정확하지 않을 수 있습니다.


Java에는 변수 타입에는 기본형(Primitive Type)과 참조형(Reference Type)이 있다.
기본형은 short, int, long, float, double, byte, char, boolean로 총 8개가 지원된다.

기본형과 참조형의 차이

기본형 변수는 값을 그대로 저장한다.
반면 참조형 변수는 객체의 레퍼런스를 저장한다.

int a = 3; // 기본형
int b[] = new int[]{1,2,3} // 참조형

기본형은 사이즈가 고정되어있기 때문에 해당 변수의 메모리 공간에 그대로 값을 할당하면 된다.
그런데 참조형에는 객체가 할당되어야 하는데, 그 사이즈가 유동적이다. 그래서 바로 값을 할당할 수 없고 힙(Heap) 영역에서 별도의 메모리공간을 차지하여 그곳에 할당한뒤 변수에는 해당 힙 영역의 주소값을 가리키게 한다.

왜 기본형과 참조형 두 개념이 있는 걸까

기본형도 참조형처럼 레퍼런스를 참조하게 되면 개발자는 기본형과 참조형의 차이를 두지 않고 개발할 수 있을거 같은데 왜 두 개념을 구분했을까 하는 생각이 들었다.

우선 기본형을 참조형처럼 레퍼런스로 참조하는 방식으로 사용하면 기본형으로 사용했을 때에 비해 참조 비용이 증가하게 된다. 변수가 몇개 안되면 성능 차이가 안느껴질 수 있지만 int[]의 사이즈가 매우 크다고 생각 했을 때 모든 요소를 참조할 때 마다 힙 영역의 메모리 주소를 또 다시 참조해야 한다고 하면 비용 차이가 커질 수 있다.

때문에 기본형으로 처리할 수 있는 것은 기본형으로 쓰는 것이 나을 것이다.

래퍼클래스(Wrapper Class)

Java는 객체지향 언어이다. 모든 것을 객체로 다룬다! 문제는 기본형은 객체가 아니라는 거다.
List에 int를 넣고 싶다고 해서 List<int> a;와 같이 선언할 수 없다.
저게 왜 안돼? 라고 생각을 할 수 있는데, 모든 것을 객체로 다루는 Java에서 기본형까지 저런식으로 사용할 수 있게 하려면 그 구현이 매우 복잡했을 것이여서 그렇지 않을 까 한다.

이럴 때 사용하는데 래퍼클래스이다. 래퍼 클래스는 기본형을 객체로 한번 감싼 클래스이다. 때문에 기본형을 객체로 다룰 수 있게 해준다.

public class Integer {
    ...
    private final int value;
    ...
}
// Integer라는 래퍼클래스를 사용하면 List에 정수형값을 담을 수 있다. 
List<Integer> a;

// 기본형은 null값을 가질 수 없지만 래퍼 클래스 변수는 null값을 가질 수 있다.
Integer b = null;

그럼 기본형 대신 항상 래퍼클래스를 쓰면 되지 않을까?

역시나 비용문제가 크다. 객체 생성 비용, 참조 비용등... 기본형에 비해 비싸다. 필요할 때만 써야한다. 

그럼 기본형의 개념을 숨기고 모든 것을 객체로만 처리하게 할 수는 없을까?

컴파일러 내부적으로 기본형의 개념을 가지되, 개발자는 기본형을 모르고 모든 것을 객체로 다룰 수 있게 할 수도 있지 않은가? 라는 생각이 들었다.
예를 들면 Groovy의 경우 int a = 3으로 선언해도 a를 래퍼 클래스(Wrapper Class)로 오토박싱(Autoboxing)하여 모든 것을 객체로 다룬다고 한다.

Java는 왜 이렇게 하지 않는 걸까? 라고 생각해서 찾아보니... 비교적 최근 언어인 Groovy등은 기존 언어의 단점등을 보완해서 새로운 언어로 정의한 것이라 가능하겠지만, Java는 기존에 사용하던 오래된 언어 속하고 이런 것들을 고치기엔 너무나 많은 곳에서 사용되고 있다. 하위호환을 생각했을 때 기본형을 없애기는 힘들 것 같다.

'개발 > Java' 카테고리의 다른 글

[Java] Generics  (0) 2020.05.23
[Java] private vs protected  (0) 2020.02.17
[Java] 불변(Immutable) 속성  (0) 2020.02.04
[Java] 자바 네티이브 인터페이스(JNI)  (0) 2020.02.01
[JVM] 런타임 데이터 영역(Run-time Data Area)  (0) 2020.02.01

+ Recent posts