(요약)
- int: 기본형 타입(Primitive Type). 숫자 값 자체를 저장합니다. 객체가 아닙니다.
- Integer: 참조형 타입(Reference Type). int 값을 객체로 감싼 래퍼 클래스(Wrapper Class)입니다.
특징 (Feature) |
int (기본형) | Integer (래퍼 클래스/객체) |
종류 (Type) | Primitive Type (기본형 타입) | Class / Object (참조형 타입) |
데이터 저장 (Storage) | 실제 정수 값 (Value) | 객체 참조/주소 (Reference to Object) |
메모리 (Memory) | 스택(Stack) 영역에 주로 저장 | 힙(Heap) 영역에 객체 생성 |
null 허용 (Nullable?) | 불가능 (No) | 가능 (Yes) |
기본값 (Default Value) | 0 | null |
메서드 보유 (Methods?) | 없음 (No) | 있음 (Yes, e.g., intValue(), parseInt()) |
제네릭/컬렉션 (Generics/Collections) | 사용 불가 (List<int> X) | 사용 필수 (List<Integer> O) |
성능 (Performance) | 산술 연산 시 일반적으로 더 빠름 | 객체 관련 오버헤드 존재 |
주요 차이점 상세 설명
- 기본형 vs. 객체:
- int는 Java가 미리 정의한 8개의 기본 타입 중 하나로, 데이터의 실제 값을 변수 공간에 직접 가집니다. 객체가 아니므로 객체지향의 특징(메서드 호출 등)을 직접 적용할 수 없습니다.
- Integer는 int 값을 내부에 포함하는 객체입니다. 변수는 이 객체가 실제 저장된 힙 메모리의 주소(참조)를 가집니다. 객체이므로 다양한 메서드를 가지고 있습니다.
- Null 값 허용 여부:
- int는 기본형이므로 null 상태를 가질 수 없습니다. 값이 할당되지 않으면 기본값 0을 가집니다.
- Integer는 객체이므로 null 참조를 가질 수 있습니다. 이는 "값이 없음" 또는 "아직 설정되지 않음" 상태를 표현해야 할 때 유용합니다 (예: 데이터베이스 조회 결과).
- 제네릭 및 컬렉션 프레임워크 사용:
- Java의 제네릭(<>)과 컬렉션 프레임워크(ArrayList, HashMap 등)는 객체만을 다룰 수 있도록 설계되었습니다. 따라서 int와 같은 기본형은 직접 사용할 수 없습니다.
- 이 때문에 컬렉션에 정수 값을 저장하려면 Integer 래퍼 클래스를 사용해야 합니다 (ArrayList<Integer>).
오토박싱 (Auto-boxing) & 오토언박싱 (Auto-unboxing)
Java 5부터 컴파일러가 int와 Integer 사이의 변환을 자동으로 처리해 줍니다.
- 오토박싱: int -> Integer 자동 변환 (Integer numObj = 10;)
- 오토언박싱: Integer -> int 자동 변환 (int num = numObj;)
이 기능 때문에 두 타입을 코드 상에서 비슷하게 쓸 수 있지만, 내부적으로는 변환이 일어나며 근본적인 타입 차이는 여전히 존재합니다. 특히 Integer 변수가 null일 때 오토언박싱이 일어나면 NullPointerException이 발생할 수 있으므로 주의해야 합니다.
언제 무엇을 사용할까?
- int: 단순한 숫자 계산, 배열 인덱스, 루프 카운터 등 성능이 중요하고 null 값이 필요 없으며 객체 기능이 필요 없을 때 주로 사용합니다.
- Integer: 제네릭이나 컬렉션을 사용해야 할 때, 값이 null일 수 있는 상황을 표현해야 할 때, Integer 클래스가 제공하는 유틸리티 메서드(예: Integer.parseInt())가 필요할 때 사용합니다.
Integer[] -> int[] 오토 언박싱은 불가능하다.
오토박싱/언박싱은 기본형과 그에 해당하는 래퍼 객체 '하나하나' 사이에서 동작하는 기능이지,
배열 타입 전체를 자동으로 변환해주는 기능은 아님
'JAVA' 카테고리의 다른 글
length 그리고 length(), size() (0) | 2025.04.02 |
---|