[Java] 원시타입 vs 참조타입

고병갑·2026년 2월 20일

java study

목록 보기
11/15

원시 타입 (Primitive)

  • Stack에 값 직접 저장
  • null 불가능
  • 기본값 : false, 0 등
  • 메모리 적게 사용
  • 성능 빠름
  • 제네릭 사용 불가
  • ex) boolean, int, double
boolean a = true;
boolean b = false;
// a = null; -> 컴파일 에러

참조 타입 (Reference/Wrapper)

  • Heap에 객체 주소 저장
  • null 가능
  • 기본값 : null
  • 메모리 많이 사용 (객체 오버헤드)
  • 원시 타입에 비해 상대적으로 느림
  • 제네릭 사용 가능
  • ex) Boolean, Integer, Double
Boolean x = true;   // Auto-boxing: Boolean.valueOf(true)
Boolean y = null;   //  null 허용
Boolean z = false;

🤔 Auto-boxing / Unboxing 이란?

boxing : 원시타입 -> 참조타입 클래스
unboxing : 참조타입 클래스 -> 원시타입
(java 5 부터 컴파일러가 자동으로 변환)

⭐️ java의 컬렉션/제네릭은 객체만 다룰 수 있어 boxing하여 참조 타입 (wrapper) 클래스로 감싸야 객체처럼 쓸수 있음

// 명시적 boxing (옛날 방식)
Integer a = Integer.valueOf(10);

// Auto-boxing (컴파일러가 위 코드로 자동 변환)
Integer b = 10;


Integer x = 100;
int y = x; // Integer -> int 자동 unboxing

// 연산 시에도 자동 unboxing
Integer c = 10;
Integer d = 20;
int result = c + d; // 둘 다 unboxing 후 연산

🚨 주의할점

  1. NullPointerException
Integer x = null;
int y = x; // NullPointerException! null을 unboxing 할 수 없음
  1. 비교
Integer a = 127;
Integer b = 127;
System.out.println(a == b); // true (캐시된 객체 재사용)

Integer c = 128;
Integer d = 128;
System.out.println(c == d); // false (새 객체 생성)
// -> Java는 -128 ~ 127 범위의 Integer 객체를 캐싱해서 재사용함

// 항상 equals() 사용 권장
System.out.println(c.equals(d)); // true 

📝 정리

원시 타입 : 일반 변수, 로컬 변수, 성능이 중요할 때
참조 타입 : null 값이 필요할 때, 컬렉션/제네릭 사용할 때

profile
노력 naver 배신🔥

0개의 댓글