티스토리 뷰
[개요]
자바에서 숫자를 다루기 위한 타입들은 크게 두 가지로 분류할 수 있습니다. 하나는 '원시 타입(primitive type)'이고, 또 다른 하나는 참조 타입(reference type)'입니다. 원시 타입은 (int, double, boolean... )을 말하며, 참조 타입은 (Integer, Double, Boolean...)을 말합니다.
요즘 자바는 오토박싱, 언박싱이 잘 되어서, 원시 타입과 참조 타입을 코드 구현상에서 같이 사용해도 개발자 입장에서는 크게 불편함이 없습니다.
int i = Integer.valueOf(1);
Integer integer = i;
//오토박싱 언박싱이 되기 때문에, 이런식으로 사용해도 컴파일 오류를 발생하지 않습니다.
(+ 참고로 오토박싱은 메모리 누수의 원인이 될 수 도 있습니다. 자세한 사항은 이펙티브 자바 아이템 6을 참고)
[원시 타입 vs 참조 타입]
원시 타입과 참조 타입의 기능적 차이는 크게 2가지가 있습니다.
1. Null을 담을 수 있는가?
원시 타입은 null을 담을 수 없습니다. 반면에 참조 타입은 null을 입력값으로 받을 수 있습니다.
int i = null;//불가능
Integer integer = null; //가능
2. 제네릭 타입에서 사용할 수 있는가?
원시 타입은 제네릭 타입에서 사용할 수 없습니다. 반면에 참조 타입은 제네릭 타입에서 사용할 수 있습니다.
List<int> i;//불가능
List<Integer> integer;//가능
[그럼 원시 타입의 장점은 뭐지?]
원시 타입은 null을 다루지도 못하고, 제네릭에 담기지도 못합니다. 그러면 원시타입은 언제 사용해야 할까요? 원시 타입이 참조 타입과 비교해서 갖는 장점은 '성능'상의 이점이 있습니다.
1. 접근 속도
원시 타입은 '스택' 메모리에 값이 존재합니다. 반면에 참조 타입은 하나의 인스턴스이기 때문에 '스택'메모리에는 참조값만 있고, 실제 값은 힙 메모리에 존재하게 됩니다. 그리고 값을 필요로 할 때마다 언박싱 과정을 거쳐야 하니 원시 타입과 비교해서 접근 속도가 느려지게 됩니다.
(예외적으로 엄청 큰 숫자를 복사해야 한다면, 참조값만 넘길 수 있는 참조 타입이 좋을 수 도 있습니다.)
2. 차지하는 메모리 양
차지하는 메모리에 양도 참조타입이 훨씬 많습니다.
(아래 비교표는 64비트 컴퓨터 기준입니다.)
원시타입이 사용하는 메모리 | 참조타입이 사용하는 메모리 |
boolean - 1bit | Boolean – 128 bits |
byte - 8bits | Byte - 128bits |
short, cagr - 16bits | Short, Charater - 128bits |
int, float - 32bits | Integer, Float - 128bits |
long, double - 64bits | Long, Double - 196bits |
[결론]
성능과 메모리에 장점이 있는 원시 타입을 먼저 고려해봅니다. 만약 Null을 다뤄야 하거나, 제네릭 타입에서 사용되어야 한다면 참조 타입을 사용합니다.
참고 자료
'Java' 카테고리의 다른 글
EnumMap(EnumSet) 쓰면 좋을까? (vs HashMap) (2) | 2019.06.06 |
---|---|
내부(inner) class와 내부(inner) static class 차이 (7) | 2019.06.02 |
쓰레드 덤프(Thread Dump) (0) | 2019.03.13 |
자바는 왜 다중상속을 지원하지 않을까? (다이아몬드 문제) (9) | 2019.02.24 |
자바(JVM)의 메모리 사용 방식 (T 메모리 구조) (7) | 2019.02.21 |