본문 바로가기

프로그래밍 언어/Java

Java 참조형(Reference Data Types)과 기본형(Primitive Types) 차이점

Java 참조형(Reference Data Types)과 기본형(Primitive Types) 차이점

Java 언어의 타입 시스템은 크게 기본형(Primitive Type)참조형(Reference Type)으로 나뉩니다. 이 둘은 저장 방식, 메모리 구조, 처리 속도, 기능 측면에서 분명한 차이가 있습니다. 본 문서에서는 각 타입의 특징과 차이점사례 중심으로 명확히 설명하며, 혼란을 방지할 수 있는 이해 중심의 안내서를 제공합니다.

 

 

목차

  1. Java의 데이터 타입 개요
  2. 기본형 데이터 타입의 특성
  3. 참조형 데이터 타입의 특성
  4. 메모리 저장 방식의 차이
  5. Boxing과 Unboxing: 두 타입의 연결고리
  6. 성능 및 활용에 따른 고려사항
  7. 타입 선택 시 모범 사례

 

1. Java의 데이터 타입 개요

Java의 데이터는 크게 두 가지로 나뉩니다:

  • Primitive Type: 값 그 자체를 저장
  • Reference Type: 객체의 주소를 저장

이 구분은 메모리 구조, 비교 방법, null 처리 등에 있어 근본적인 차이를 발생시킵니다.

 

 

 

2. 기본형 데이터 타입의 특성

기본형(Primitive Types)은 Java에서 가장 단순하고 빠른 형태의 데이터입니다. Java는 총 8개의 기본형을 제공합니다.

타입 크기 예시
int 32bit int x = 10;
double 64bit double pi = 3.14;
boolean 1bit (논리적) boolean flag = true;
char 16bit (Unicode) char c = 'A';

기본형은 스택(Stack) 메모리에 저장되며 다음과 같은 특징을 가집니다:

  • 값 자체를 저장 (복사 시 원본과 독립적)
  • 비교 연산이 값 중심 (== 사용)
  • 객체가 아니므로 메서드 사용 불가

 

 

 

3. 참조형 데이터 타입의 특성

참조형은 객체를 가리키는 메모리 주소(참조값)를 저장합니다.

대표적인 참조형:

  • 클래스: String, Scanner
  • 배열: int[], String[]
  • 인터페이스, 열거형 등
String name = "Java";
int[] numbers = {1, 2, 3};

참조형은 힙(Heap) 메모리에 생성되고, 변수에는 객체의 주소값만 저장됩니다.

 

 

 

4. 메모리 저장 방식의 차이

두 타입 간의 가장 핵심적인 차이는 메모리 저장 위치에 있습니다.

  • 기본형: Stack에 저장 (고속 접근)
  • 참조형: Heap에 저장, 변수는 Stack에 참조값 보관

이로 인해 참조형은 GC(Garbage Collection)의 대상이 되며, 성능과 관련된 판단 기준이 됩니다.

 

 

 

 

5. Boxing과 Unboxing: 두 타입의 연결고리

기본형을 객체로 감싸거나 다시 풀어주는 과정은 Java에서 자동으로 처리됩니다.

  • Boxing: int → Integer
  • Unboxing: Integer → int
Integer num = 100;    // Auto-boxing
int x = num;          // Auto-unboxing

컬렉션과 같이 객체만 처리 가능한 구조에서는 Boxing이 불가피합니다.

 

 

 

6. 성능 및 활용에 따른 고려사항

  • 기본형은 계산, 반복문, 조건 처리 등 성능 중심 작업에 적합
  • 참조형은 기능 중심, 컬렉션 처리, 동적 구조 등에 적합

또한, null 처리 가능성은 참조형만 가지므로, NPE(NullPointerException) 관리에 주의가 필요합니다.

 

 

 

7. 타입 선택 시 모범 사례

  • 단순 값 처리: 기본형 우선
  • 컬렉션 저장, 객체 중심 설계: 참조형 활용
  • 박싱 남용 방지 – 반복 루프에서 Integer보다 int 사용
  • nullable 값 처리: Optional 또는 참조형 활용
Optional age = Optional.ofNullable(null);