기본 타입과 박싱된 기본 타입의 차이점과 성능적인 이슈를 다룹니다.
- 기본타입 int, double, boolean, 참조타입 string, list
- 기본 타입에는 대응하는 참조 타입이 하나씩 있음 → 박싱된 기본 타입
.
-
기본 타입
값을 담는 자료형
int, double, boolean
각각의 크기와 표현 범위가 정해짐
-
박싱된 기본 타입
해당 기본 타입을 래핑한 참조 타입
Integer, Double, Boolean
.
기본 타입은 값만을 담고 있으므로 메모리 사용량과 계산 속도가 박싱된 기본 타입에 비해 효율적이다.
따라서, 성능이 중요한 상황에서는 기본 타입을 사용하는 것이 좋다.
.
-
주된 차이 3가지
기본 타입 박싱된 기본 타입 차이1 값만 가지고 있음 값+식별성 가짐, 값이 같아도 서로 다르다고 식별 차이2 값 언제나 유효 null값 가질 수 있음 차이3 시간, 메모리 더 효율적 주의해서 사용하지 않으면 문제 발생할 수 있음
.
-
차이2를 신경쓰지 않았을 때
public class Unbelievable { static Integer i; public static void main(String[] args) { if (i == 42) System.out.println("믿을 수 없군!"); } }
i == 42 를 할 때, null 참조를 언박싱하게 되면서 NPE가 터진다.
i의 타입을 Integer에서 int로 바꿔야 한다
.
-
차이3을 신경쓰지 않았을 때
public static void main(String[] args) { Long sum = 0L; for (long i = 0; i <= Integer.MAX_VALUE; i++) { sum += i; } System.out.println(sum); }
박싱과 언박싱이 반복해서 일어나기 때문에 체감될 정도로 성능이 느려진다. ( sum = sum + i )
.
박싱된 기본 타입은 기본 타입을 참조 타입으로 사용할 수 있게 해주고, 제네릭 타입의 타입 파라미터로 사용할 수 있게 해줍니다. 또한, null 값을 표현할 수 있어 유용합니다.
따라서, 기본 타입과 박싱된 기본 타입 중 어떤 것을 사용할지는 상황에 따라 다릅니다.
.
- 박싱된 기본 타입을 쓰는 케이스
- 컬렉션의 원소, 키 값으로 사용
- 리플렉션을 통해 메서드를 호출할 때 사용