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를 써야 합니다.


🤔 자바가 두 타입을 구분한 이유

  1. 성능 최적화
    · 1990년대 하드웨어 한계 → 객체로 숫자를 다루면 힙 할당·GC 오버헤드 큼
    · 빠른 계산용으로 C 스타일 기본형 유지
  2. 객체지향 일관성
    · 컬렉션·제네릭·리플렉션 등은 객체를 전제로 설계
    · 숫자도 컬렉션에 넣으려면 래퍼 클래스 필요

🔄 자동 변환으로 편리하게!

• 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
반응형

+ Recent posts