자바의 데이터 타입은 크게 기본 타입과 참조 타입으로 나뉩니다. 이번 포스팅에서는 이 두 가지 타입의 특징과 차이점에 대해 깔끔히 정리해 보겠습니다.
기본 타입은 값을 직접 저장하는 타입입니다.
int a = 10;
int b = a; // b는 a의 값을 복사 받음
b = 20; // b값을 변경해도 a는 영향을 받지 않음.
참조 타입은 객체가 생성된 메모리의 주소(번지)를 저장합니다.
열거형이란 상수 값들의 집합을 하나의 이름 아래 묶어서 사용하는 데이터 타입입니다.
enum Day { MONDAY, TUESDAY, WEDNESDAY }
Day today = Day.MONDAY;
enum Planet {
EARTH(5.97e+24, 6.371e6);
private final double mass;
private final double radius;
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
public double surfaceGravity() {
final double G = 6.67300E-11;
return G * mass / (radius * radius);
}
}
interface Greeting {
String getMessage();
}
enum Language implements Greeting {
ENGLISH { public String getMessage() { return "Hello!"; } },
KOREAN { public String getMessage() { return "안녕하세요!"; } }
}
int[] arr1 = {1, 2, 3};
int[] arr2 = arr1;
arr2[0] = 10;
System.out.println(arr1[0]); // 출력: 10
| 특성 | 기본 타입 | 참조 타입 |
|---|---|---|
| 데이터 저장 | 값 자체 | 데이터의 메모리 주소 (참조) |
| 저장 위치 | 스택(Stack) | 스택 + 힙 (Stack에 주소, Heap에 데이터) |
| 복사 시 동작 | 값만 복사, 독립적 | 참조 복사, 동일 객체 공유 |
| 종류 | int, boolean 등 | 배열, 객체, String 등 |
자바 프로그램이 실행될 때 메모리는 여러 영역으로 나뉘어 관리됩니다. 각 영역의 특징을 이해하면 프로그램을 효율적으로 설계할 수 있습니다.
public class MemoryExample {
static int staticVar = 100; // 메서드 영역
public static void main(String[] args) {
int localVar = 10; // 스택 영역
MyClass obj = new MyClass(); // 힙 영역에 객체 생성
obj.instanceVar = 20; // 힙에 저장된 객체의 변수 사용
}
}
class MyClass {
int instanceVar; // 힙 영역
}
| 영역 | 저장 내용 | 특징 |
|---|---|---|
| 메서드 영역 | 클래스, 메서드 정보, static 변수 | 프로그램 전체에서 공유 |
| 힙 영역 | 객체, 인스턴스 변수 | 동적 할당, GC 관리 |
| 스택 영역 | 메서드 호출 정보, 지역 변수 | LIFO 구조 |
| PC 레지스터 | 실행 중인 명령어 위치 | 각 스레드 독립적 |
| 네이티브 메서드 스택 | 네이티브 코드 관련 데이터 | JVM 외부 언어 지원 |