728x90
반응형
자바를 공부하다 보면 꼭 부딪히는 의문이 있습니다.
“왜 자바에는 int 같은 기본형(primitive) 숫자 타입과 Integer 같은 참조형(wrapper) 숫자 타입이 따로 있을까?”
처음엔 번거롭게 느껴지지만, 이 이중 구조 안에는 성능과 객체지향을 동시에 잡으려는 자바의 철학이 숨어 있습니다.
🔍 기본형 vs 참조형, 무엇이 다를까?
int(기본형) | Integer (참조형) | |
메모리 사용량 | 작음 (4바이트) | 큼 (객체라 헤더·포인터 추가) |
null 저장 | 불가 | 가능 |
연산 성능 | 빠름 | 느림 |
주 사용처 | 계산용 숫자 | 컬렉션(List·Map 등), null 처리 |
비교 방식 | 값 비교 == | 참조 비교 == 또는 equals() |
👉 계산 → int 등 기본형
👉 컬렉션·null 필요 → Integer 등 참조형
💡 예제로 바로 확인
int a = 3;
Integer b = 3;
System.out.println(a == b); // true (auto-unboxing)
List list = List.of(1, 2, 3); // OK
// List는 컴파일 오류
기본형은 그냥 숫자 값이지만, 컬렉션에는 객체만 넣을 수 있어서 Integer를 써야 합니다.
🤔 자바가 두 타입을 구분한 이유
- 성능 최적화
· 1990년대 하드웨어 한계 → 객체로 숫자를 다루면 힙 할당·GC 오버헤드 큼
· 빠른 계산용으로 C 스타일 기본형 유지 - 객체지향 일관성
· 컬렉션·제네릭·리플렉션 등은 객체를 전제로 설계
· 숫자도 컬렉션에 넣으려면 래퍼 클래스 필요
🔄 자동 변환으로 편리하게!
• Auto-boxing : 기본형 → 참조형 (Integer obj = 10;)
• Auto-unboxing: 참조형 → 기본형 (int num = obj;)
컴파일러가 자동으로 Integer.valueOf / intValue() 호출을 삽입합니다.
🧠 언제 어떤 타입을 써야 할까?
상황 | 권장타입 | 이유 |
집중적 수치 연산 | int, double 등 기본형 | 힙 할당·GC 없이 가장 빠름 |
List/Map 저장 | Integer, Double 등 | 컬렉션이 객체만 취급 |
null 구분 필요 | Integer 등 | 기본형은 null 불가 |
Java 8 스트림 성능 | IntStream, LongStream | 박싱 비용 제거 전용 API |
🧩 다른 언어와 비교
• Kotlin / Swift → 기본형·참조형 구분 없음 (컴파일러가 내부 최적화)
• JavaScript / Python → 모든 숫자가 객체처럼 동작, 편의 우선
• C# → 자바와 유사하지만 값 타입 제네릭 허용
즉 자바의 이원화는 역사적 호환성과 성능을 모두 잡기 위한 타협입니다.
📌 핵심 정리
- int : 가볍고 빠른 값 타입
- Integer : 컬렉션·null·객체 비교 등에 필요한 래퍼 클래스
- Auto-boxing/Unboxing 덕분에 혼용 가능하지만,
성능이 중요한 루프나 스트림 안에서는 박싱을 주의
728x90
반응형
'백엔드' 카테고리의 다른 글
[Java 기초] int ↔ String 형변환 (0) | 2025.07.07 |
---|---|
[Java] java.lang.ArithmeticException: / by zero 에러나는 이유 및 해결 방법 (1) | 2025.04.25 |
공공데이터포털 30 SERVICE KEY IS NOT REGISTERED ERROR (0) | 2025.01.14 |
맥북 터미널 이름 바꾸기 로컬 사용자 이름 호스트 네임 (0) | 2025.01.12 |
Docker 설치하는 방법 공식문서 링크 영어 문서 보는 꿀팁 (1) | 2025.01.08 |