책/Effective Java

[이펙티브 자바] 아이템 61: 박싱된 기본 타입보다는 기본 타입을 사용하라

2022. 7. 6. 23:49
목차
  1.  
  2. 선결론
  3. 기본 타입과 박싱된 기본 타입의 주된 차이
  4. 박싱된 기본 타입의 위험성
  5. 박싱된 기본 타입을 사용하는 상황
본문은 Effective Java를 읽고 간단하게 정리한 글입니다. 필요에 따라 생략/수정된 부분이 있을 수 있으며, 내용이 추후 변경될 수 있습니다.

 

선결론

  • 되도록이면 박싱된 기본 타입 대신 기본 타입을 사용하라
  • 기본 타입은 박싱된 기본 타입에 비해 안전하고, 간단하고, 빠르다

 

 

기본 타입과 박싱된 기본 타입의 주된 차이

  1. 기본 타입은 값만 가지고 있으나, 박싱된 기본 타입은 값에 더해 식별성(identity)이란 속성을 갖는다
  2. 기본 타입의 값은 유효하나, 박싱된 기본 타입은 유효하지 않은 값(null)을 가질 수 있다
  3. 기본 타입이 박싱된 기본 타입보다 시간과 메모리 사용면에서 더 효율적이다

 

 

박싱된 기본 타입의 위험성

1) 식별성, 즉 참조값을 비교하므로 예상 밖의 비교 결과가 나올 수 있다

잘못된 구현된 비교자 예제를 통해 박싱된 기본 타입의 위험성을 알 수 있다

Comparator<Integer> naturalOrder = (i, j) -> (i < j) ? -1 : (i == j ? 0 : 1);
  • 주어진 두 수를 비교하여 왼쪽의 수가 크면 양수, 같다면 0, 오른쪽의 수가 크면 음수를 반환한다
  • 즉, compare의 역할을 하는 메서드이다

 

해당 비교자를 이용하여 실제 검사를 수행하면 다음과 같이 예상 밖의 결과가 나온다

public class Item61 {

    public static void main(String[] args) {
        Comparator<Integer> naturalOrder = (i, j) -> (i < j) ? -1 : (i == j ? 0 : 1);
        System.out.println(naturalOrder.compare(new Integer(42), new Integer(42)));
        // 출력결과: 1
    }
}
  • 두 Interger의 값이 42로 같으므로 0을 출력해야 할 것 같지만, 실제로는 1을 출력한다
  • 이는 두 번째 검사(i==j)가 이뤄지는 과정에서 두 객체의 참조값을 검사하게 되고, 참조값이 다르므로 1을 반환하는 것이다
  • 이처럼 박싱된 기본 타입에 == 연산자를 사용하면 오류가 일어날 수 있다

 

이러한 위험성 때문에 IDE에서 제안을 해준다

  • 첫 번째 제안: 비교 연산자 대신 Integer.compare를 사용할 것
  • 두 번째 제안: compare를 사용할 때 박싱된 기본 타입 대신 기본 타입을 사용할 것

 

이 중 첫 번째 제안을 받아들여 메서드 참조로 코드를 변경하면 원했던 결과가 나온다

 

Integer.compareTo는 Integer.compare를 호출하는데, compare의 매개변수의 타입이 Int이므로 언박싱이 일어나게 된다

기본 타입끼리 비교가 일어나므로 정상적으로 0을 반환한다

 

비교자에 대한 추가적인 팁

  • 기본 타입을 다루는 비교자가 필요하다면 Comparator.naturalOrder()를 사용하라
    • 실제로 위 예제에서 메서드 참조 대신 Comparator.naturalOrder()를 넣어도 올바르고 작동한다!
  • 비교자를 직접 만들면 비교자 생성 메서드나 기본 타입을 받는 정적 compare 메서드를 사용해야 한다(아이템 14). 이때, Interger 매개변수의 값을 기본 타입 정수로 저장하거나 파라미터로 넘긴 후, 모든 비교를 이 기본 타입 변수로 수행한다

 

2) NullPointerException이 발생할 수 있다

  • 박싱된 기본 타입 변수의 초기값은 null이다
  • 이와 같이 초기화를 시키지 않은 상태로 기본 타입 변수와 비교(==)를 시도하면 오토언박싱이 일어나고 NullPointerException이 발생한다
  • 기본 타입과 박싱된 기본 타입이 혼용된 연산에서는 오토언박싱과 NullPointerException이 발생할 수 있음을 주의해야 한다

 

3) 성능이 저하될 수 있다

  • 해당 내용은 이펙티브 자바 곳곳에서 나왔던 내용이다
  • 박싱과 언방식이 반복해서 일어나면 눈에 띌 정도로 성능이 저하될 수 있다

 

 

박싱된 기본 타입을 사용하는 상황

1) 컬렉션의 원소, 키, 값

  • 컬렉션은 기본 타입을 담을 수 없으므로

2) 매개변수화 타입이나 매개변수화 메서드의 타입 매개변수(아이템26)

  • 자바 언어가 타입 매개변수로 기본 타입을 지원하기 않기 때문에
  • 예) ThreadLocal<Integer>

3) 리플렉션(아이템65)를 통해 메서드를 호출할 때

저작자표시 비영리 (새창열림)

'책 > Effective Java' 카테고리의 다른 글

[이펙티브 자바] 아이템 63: 문자열 연결은 느리니 주의하라  (0) 2022.07.12
[이펙티브 자바] 아이템 62: 다른 작업이 적절하다면 문자열 사용을 피하라  (0) 2022.07.07
[이펙티브 자바] 아이템 60: 정확한 답이 필요하다면 float와 double은 피하라  (0) 2022.07.01
[이펙티브 자바] 아이템 59: 라이브러리를 익히고 사용하라  (0) 2022.07.01
[이펙티브 자바] 아이템 58: 전통적인 for문보다는 for-each문을 사용하라  (0) 2022.06.30
  1.  
  2. 선결론
  3. 기본 타입과 박싱된 기본 타입의 주된 차이
  4. 박싱된 기본 타입의 위험성
  5. 박싱된 기본 타입을 사용하는 상황
'책/Effective Java' 카테고리의 다른 글
  • [이펙티브 자바] 아이템 63: 문자열 연결은 느리니 주의하라
  • [이펙티브 자바] 아이템 62: 다른 작업이 적절하다면 문자열 사용을 피하라
  • [이펙티브 자바] 아이템 60: 정확한 답이 필요하다면 float와 double은 피하라
  • [이펙티브 자바] 아이템 59: 라이브러리를 익히고 사용하라
코택
코택
TaxFree코택 님의 블로그입니다.
코택
TaxFree
코택
전체
오늘
어제
  • 분류 전체보기 (369)
    • Spring (29)
      • Spring (18)
      • 스프링 핵심 원리 - 고급편 (11)
    • Spring Batch (4)
    • JPA (4)
    • CS (89)
      • 자료구조 (2)
      • 네트워크 (5)
      • 운영체제 (1)
      • 데이터베이스 (4)
      • SQL (7)
      • 알고리즘 이론 (4)
      • 알고리즘 문제 풀이 (66)
    • 웹 (28)
      • React.js (4)
      • Next.js (1)
      • Node.js (14)
      • FastAPI (4)
      • Django (5)
    • 프로그래밍 언어 (45)
      • Python (5)
      • Java + Kotlin (29)
      • JavaScript + TypeScript (11)
    • 테스트코드 (26)
      • ATDD, 클린 코드 with Spring (4)
      • 이규원의 현실 세상의 TDD: 안정감을 주는 코드.. (20)
    • 인프라 (6)
      • AWS (2)
      • Kubernetes (4)
    • 트러블슈팅 (25)
    • 책 (89)
      • Effective Java (54)
      • Effective Kotlin (14)
      • 도메인 주도 개발 시작하기: DDD 핵심 개념 정.. (11)
      • 웹 프로그래머를 위한 데이터베이스를 지탱하는 기술 (6)
      • 도메인 주도 설계 첫걸음 (4)
    • Git (10)
    • 회고 (5)
    • etc (8)

블로그 메뉴

  • 홈
  • 방명록
  • 관리
  • GitHub
  • LinkedIn

공지사항

  • 스킨 관련

인기 글

태그

  • mysql
  • 파이썬
  • 그래프
  • http
  • fastapi
  • atdd
  • 브루트포스
  • Shortest Path
  • 백준
  • Git
  • 그래프 탐색
  • 장고
  • 깊이 우선 탐색
  • BOJ
  • dp

최근 댓글

최근 글

hELLO · Designed By 정상우.
코택
[이펙티브 자바] 아이템 61: 박싱된 기본 타입보다는 기본 타입을 사용하라
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.