자바에서 메서드에 변수를 전달할 때, 원본 값이 변하는 경우와 변하지 않는 경우가 있습니다.
헷갈리기 쉬운 이 두가지 현상을 기본형과 참조형 변수의 차이로 정리해 보았습니다.
1. 자바는 오직 'Call by Value'
자바에는 C++과 같은 진정한 의미의 'Call by Reference(참조에 의한 호출)'가 없습니다.
항상 값을 복사해서 전달(Call by Value)하지만, 변수 타입에 따라 복사되는 대상이 다릅니다.
- 기본형 (Primitive Type): 실제 데이터 값을 복사하여 전달. (원본에 영향 없음)
- 참조형 (Reference Type): 클래스, 배열 등은 객체가 위치한 메모리의 주소값(Address)을 복사하여 전달합니다. (주소를 통해 원본 객체 수정 가능)
즉, 어떤 타입의 파라미터로 메서드를 호출하느냐에 따라 "원본 데이터가 수정되는가?"라는 결과를 결정짓는 핵심 원인이 됩니다.
2. 코드 비교
동일한 기능의 메서드를 오버로딩하여, 기본형과 참조형을 전달했을 때의 결과를 비교해 보았습니다.
class NumberBox {
int value;
public NumberBox(int value) { this.value = value; }
}
public class CallByTest {
public static void main(String[] args) {
int primitiveNum = 10;
NumberBox refBox = new NumberBox(10);
changeValue(primitiveNum); // 기본형 전달: 값(10) 복사
changeValue(refBox); // 참조형 전달: 주소값 복사
System.out.println("기본형 변수: " + primitiveNum); // 10 (변경 안 됨)
System.out.println("참조형 객체 값: " + refBox.value); // 999 (원본 변경됨)
}
// 기본형 파라미터
static void changeValue(int num) {
num = 999;
}
// 참조형 파라미터
static void changeValue(NumberBox box) {
box.value = 999;
}
}
참조형 변수를 넘길 때는 '주소값'이 복사되어 전달되기 때문에 메서드 내부에서 원본 객체의 상태를 변경할 수 있습니다.
객체를 넘겼다가 원본 데이터가 훼손되는 부작용이 발생할 수 있으므로, 이 점을 인지하고 코드를 작성해야 합니다.
3. 참고 링크
코드 시각화 도구: Java Visualizer
작성한 코드가 메모리에서 어떻게 움직이는지 단계별로 확인할 수 있어 추천합니다.

'language study > java | 문제풀이' 카테고리의 다른 글
| [Java] 객체지향 기초 : 상속(Is-A), 포함(Has-A), super, 오버라이딩과 다형성 (0) | 2026.05.21 |
|---|---|
| [Java] 알고리즘 기초 : 배열과 리스트, 언제 무엇을 쓸까? (1) | 2026.05.11 |
| [Java] 기본 문법 정리 : final, 오버로딩, 생성자, 가변인자 정리 (0) | 2026.05.11 |
| [Java] 객체지향 기초: this와 static (클래스 변수와 클래스 메서드) (1) | 2026.05.06 |
| [Java] 객체지향 기초 : 클래스와 메서드 (0) | 2026.05.06 |