728x90
반응형
Java Data Type
- 기본 타입 : int , double, boolean ..
- 참조 타입 : String, List ...
기본 타입과 참조 타입의 차이에 대해서 설명해주세요
더보기
1. 각 타입에 따라 저장되는 값이 다르다.
A. 기본 타입 - 변수에는 실제 값이 저장된다.
B. 참조 타입 - 배열, 열거, 클래스, 인터페이스를 이용해서 선언된 변수는 메모리 주소 값을 가지게 된다.
2. 해당 값이 저장되는 위치
A. 기본 타입 - Stack
B. 참조 타입 - Heap
기본 타입과 박싱된 기본 타입의 차이에 대해서 설명해주세요
더보기
기본타입 : int, double , boolean ...
박싱된 기본 타입 : Integer, Double , Boolean ...
차이점
- 기본 타입은 값만 가지고 있으나, 박싱된 타입은 값에 더해 식별성(identity)이란 속성을 가진다.
달리 말하면 박싱된 기본 타입의 두 인스턴스는 값이 같아도 서로 다르다고 식별될 수 있다.
- 기본 타입의 값은 언제나 유효하나, 박싱된 기본타입은 유효하지 않은 값(null)을 가질 수 있다.
- 기본 타입이 박싱된 기본 타입보다 시간과 메모리 사용면에서 더 효율적이다.
# Integer 값을 오름차순으로 정렬하는 비교자
Comparator<Integer> naturalOrder = (i, j) -> (i <j) ? -1 : (i == j ? 0 : 1);
- 출력된 결과가 1로 출력된다는 것은 : 첫번째 Integer가 두 번째보다 크다고 얘기하는 것이다.
Q. 원인이 뭘까
- 두 번째 검사(==)를 Integer 클래스로 진행할 경우 두 객체간의 참조 식별성 검사를 진행하게 되고 결국 값은 false가 나오게 된다.
- 따라서 실무에서는 해당 메서드를 사용하기 위해서는 기본 타입을 받는 정수로 바꾸어주는 처리를 해주어야한다.
# 기이하게 동작하는 프로그램
public class Unbelievable {
static Integer i;
public static void main(String[] args) {
if(i == 42)
System.out.println(“믿을 수 없군”);
}
}
- 물론 해당 조건에 대해서 sout는 출력되지 않는다.
- 하지만 if 내 조건을 확인하면서 NullPointerException이 발생하게 된다
- int가 아닌 Integer이기 때문에 초기 값이 null이기 때문이다.
- 따라서 null == int 를 비교하는 것이다
- 거의 예외 없이 기본 타입과 박싱된 기본 타입을 혼용한 연산에서는 박싱된 기본 타입의 박싱은 자동으로 풀린다.
- 이 때 null 참조를 언박싱하면 NullPointerException이 발생하게 되는것이다.
# 끔찍이 느린 코드
public static void main(String[] args) {
Long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i ++) {
sum += i;
}
}
- 느려지는 이유 : sum += 하는 과정에서 박싱과 언박싱이 반복된다. → 성능 저하
# 박싱된 타입을 써야할 때
- 컬렉션의 원소, 키, 값으로 쓸 때
- 컬렉션은 기본 타입을 담을 수 없으므로 박싱된 기본 타입을 써야만한다.
- 매개변수화 타입이나 매개변수화 메서드의 타입 매개변수로는 박싱된 기본 타입을 써야한다.
- Java는 타입 매개변수로 기본 타입을 지원하지 않음 ex)
ThreadLocal<int>
- Java는 타입 매개변수로 기본 타입을 지원하지 않음 ex)
- 리플렉션을 통해 메서들르 호출할 때도 박싱된 기본 타입을 사용해야 한다.
정리
기본 타입과 박싱된 기본 타입 중 하나를 선택해야 한다면 가능하면 기본 타입을 사용하라.
기본 타입은 간단하고 빠르다.
박싱된 기본 타입을 써야 한다면 주의를 기울이자.
- 오토박싱이 박싱된 기본 타입을 사용할 때의 번거로움을 줄여주지만, 그 위험까지 없애주지 않는다.
- 기본 타입을 박싱하는 작업은 필요 없는 객체를 생성하는 부작용을 나을 수 있다.
728x90
반응형
'책 > Effective Java' 카테고리의 다른 글
문자열 연결은 느리니 주의하라 (0) | 2022.05.15 |
---|---|
다른 타입이 적절하다면 문자열 사용을 피하라 (0) | 2022.05.15 |
정확한 답과 계산을 해야한다면 float와 double은 피하라 (0) | 2022.05.14 |
메서드 참조 (Method Reference) (0) | 2022.03.20 |
lambda(람다) 사용법 (0) | 2022.03.20 |