-
item61. 박싱된 기본 타입보다는 기본 타입을 사용하라.⚓️서론자바의 데이터 타입은 크게 두 가지로 나눌 수 있다. 기본타입(Primitive Type) 과 참조타입(Reference Type) 이 있다. 기본타입에는 각각 대응하는 참조타입이 있는데, 그것을 박싱된 기본타입이라고 한다.
➡️오토 박싱(AutoBoxing)과 오토 언박싱(AutoUnBoxing)// Integer -> int
Integer num = new Integer(10);
int i = num; // Auto UnBoxing
//int -> Integer
int num2 = 10;
Integer j = 10; // Auto Boxing JDK 1.5부터는 박싱과 언박싱이 필요한 상황에서 자바 컴파일러가 이를 자동으로 처리해준다. 그전에는 시대는.. 참 귀찮았다.
Integer num = new Integer(10); // Boxing
int n = num.intValue(); // Unboxing
int num2 = 10;
Integer j = Integer.valueOf(num2); // Boxing 그렇다면 기본 타입과 래퍼타입은 무슨 차이일까? ➡️기본타입(Primitive Type) VS 박싱된 기본타입(Wrapper Type)
1️⃣ 기본 타입은 값만 가지고 있다. 반면에 박싱된 기본타입은 2️⃣ 기본 타입의 값은 언제나 유효하지만 박싱된 기본 타입은 유효하지 않는 값, Null을 가질 수 있다. 3️⃣ 기본 타입이 박싱된 기본 타입보다 시간과 메모리 사용면에서 더 효율적이다. 📎참고 - Java Primitives versus Objects 위의 세 가지를 유의하지 않고 사용할 경우 문제가 발생할 수 있다. ➡️ 문제가 발생하는 경우1️⃣잘못 구현된 비교자 예시public class BrokenComparator {
public static void main(String[] args) {
Comparator<Integer> naturalOrder =
(i, j) -> (i < j) ? -1 : (i == j ? 0 : 1);
int result = naturalOrder.compare(new Integer(42), new Integer(42));
System.out.println(result); // 1
}
} 두 Integer 인스턴스의 값이 42로 같으므로 0을 출력해야 하지만, 실제로는 1을 출력한다. ❓출력은 1 이다. 왜? 0이 아니고 1일까? 🔡원인
🔡분석
위와 같은 문제를 고치려면.. 지역변수 2개를 두어 각각 박싱된 Integer 매개변수의 값을 기본 타입 정수로 저장한 다음 모든 비교를 이 기본 타입 변수로 수행하면 된다. 이렇게 하면 오류의 원인인 Comparator<Integer> naturalOrder = (iBoxed, jBoxed) -> {
int i = iBoxed, j = jBoxed; // 오토박싱
return i < j ? -1 : (i == j ? 0 : 1);
}; 2️⃣ NullPointerException 발생public class Unbelievable {
static Integer i;
public static void main(String[] args) {
if (i == 42) System.out.println("믿을 수 없군!");
}
} 위 프로그램은 ❓‘믿을 수 없군!’이 아니라 왜 NullpointerException을 던지는 것일까? 🔡원인
위의 해법은 i를 int로 선언해주면 된다. 너무 간단하다.. 3️⃣ Auto Boxing과 Auto UnBoxing으로 인한 성능 저하public class App {
public static void main(String[] args) {
Long sum =0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++) {
sum += i;
}
System.out.println(sum);
}
} 위 코드는 엄청 느리게 결과를 출력한다. ❓ 왜 엄청나게 느리게 출력하는 걸까? 🔡원인
➡️박싱된 기본 타입은 언제 써야 하는가?1️⃣ 컬렉션의 원소, 키 , 값으로 쓴다.
• 리플렉션(Reflection)을 통해 메서드를 호출할 때에도 박싱된 기본타입을 사용한다. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ✅핵심 정리
|
Beta Was this translation helpful? Give feedback.
Replies: 2 comments 4 replies
-
코틀린은 기본 타입이 없다고해요 ->기본 타입의 문제점이 발생하지 않는 장점이 있습니다.
|
Beta Was this translation helpful? Give feedback.
-
정리해주신 글 잘 읽었습니다~ 저는 웹 백엔드 개발을 할 때 path 에 논리( 예를 들면, 아니면 path variable 에 포함된 정수 타입은 |
Beta Was this translation helpful? Give feedback.
정리해주신 글 잘 읽었습니다~
저는 웹 백엔드 개발을 할 때 path 에 논리(
true
/false
) 타입 또는 정수 타입이 필요하면 원시 타입과 래퍼 클래스 중 스펙을 고민하곤 합니다.예를 들면,
JpaRepository
내 추상 메서드 중Boolean
반환 타입인 추상 메서드의 값을 바탕으로 후속 작업을 해야 할 때,원시 타입이면 조건문을 간소화할 수 있지만, 래퍼 클래스는
Boolean.TRUE
또는Boolean.FALSE
등을 활용해서 비교해야 하는 것처럼요.아니면 path variable 에 포함된 정수 타입은
null
이 들어오지 않는다는 것이 정책상 명확하다면, 굳이 원시 타입을 안 쓸 이유가 있는가? 처럼요.여러분들의 의견은 어떤지 궁금합니다.