자바에서 변수를 다룰 때 가장 먼저 이해해야 하는 개념이 기본형과 참조형의 차이이다. 이 구분은 단순히 문법을 넘어서, 메모리 구조, 메서드 호출 방식, NullPointerException 같은 핵심 동작 원리와 직결된다.
기본형 vs 참조형
- 기본형 (Primitive Type)
- int, long, double, boolean 등
- 값 자체를 저장한다.
- 산술 연산이 가능하다.
- null 할당이 불가능하다.
- 참조형 (Reference Type)
- 클래스, 배열, 인터페이스, String 등
- 참조값(주소)을 저장한다.
- 실제 객체는 힙(Heap)에 존재하고, 변수에는 주소만 존재한다.
- null 할당이 가능하다.
int a = 10; // 기본형 → 값 10 저장
Student s = new Student(); // 참조형 → Student 객체의 주소 저장
기본형은 변수에 값이 직접 들어있고, 참조형은 "객체가 있는 위치"를 가리키는 참조값을 저장한다.
변수 대입의 원리
자바의 대원칙: 자바는 항상 값을 복사해서 대입한다.
- 기본형: 값 자체를 복사
- 참조형: 참조값(주소)을 복사
// 기본형
int a = 10;
int b = a;
a = 20;
System.out.println(b); // 10 (영향 없음)
// 참조형
Data dataA = new Data();
dataA.value = 10;
Data dataB = dataA;
// 참조값 복사
dataA.value = 20;
System.out.println(dataB.value); // 20 (같은 객체 참조)
참조형 대입은 객체를 복사하는 게 아니라, 주소만 복사되므로 같은 인스턴스를 여러 변수가 공유할 수 있다.
메서드 호출과 기본형/참조형
메서드 매개변수도 결국 변수 대입과 동일한 규칙을 따른다.
기본형 전달
public static void changePrimitive(int x) { x = 20; }
int a = 10;
changePrimitive(a);
System.out.println(a); // 10 (변화 없음)
- 값 자체가 복사되므로 원본 변수에 영향을 주지 않는다.
참조형 전달
public static void changeReference(Data d) { d.value = 20; }
Data data = new Data();
data.value = 10;
changeReference(data);
System.out.println(data.value); // 20 (변경됨)
- 참조값이 복사되어 전달되므로, 같은 객체를 가리킨다. → 원본이 변경된다.
변수와 초기화
- 멤버 변수(필드): 클래스에 선언된다. 자동 초기화된다.
- 숫자 → 0
- boolean → false
- 참조형 (String 포함) → null
- 지역 변수: 메서드 안에 선언된다. 직접 초기화해야 한다.
- 초기화하지 않으면 컴파일 에러가 발생한다.
class InitData {
int value1; // 자동 초기화 → 0
int value2 = 10; // 명시적 초기화
}
null과 NullPointerException
- null: 참조형 변수가 아무 객체도 가리키지 않음을 의미한다.
- null 상태에서 . (dot) 접근 시 NullPointerException가 발생한다.
Data data = null;
data.value = 10; // NPE 발생
- null 체크 없이 객체를 사용하면 런타임 오류가 발생한다. → 조건문 등을 통한 방어적 코드가 필요하다.
정리하자면...
- 기본형: 값 자체 저장, 연산 가능, null 불가
- 참조형: 참조값 저장, 객체/배열 가리킴, null 가능
- 자바는 항상 변수 안의 값을 복사해서 대입/전달한다.
- 메서드 호출 시 → 기본형은 변화 없음, 참조형은 객체 내부 값 변경 가능
- null을 다룰 때는 반드시 방어 로직 필요 (if (obj != null) {...})
기본형과 참조형을 정확히 이해해야 객체 공유, 메모리 구조, 메서드 동작을 예측할 수 있다.
이것이 자바 개발자의 첫 번째 사고방식 전환이다.
'java' 카테고리의 다른 글
| Java 생성자(Constructor) 정리 (0) | 2025.09.14 |
|---|---|
| Java 객체 지향 프로그래밍(OOP) 정리 (0) | 2025.09.14 |
| Java 클래스와 데이터 정리 (0) | 2025.09.11 |
| Java 메서드(Method) 정리 (0) | 2025.09.10 |
| Java 배열(Array) 정리 (0) | 2025.09.10 |