| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- 자격증
- mapping
- jvm
- java
- bootcamp
- 개발자
- Cache
- Docker
- 스터디
- Redis
- 오블완
- 자바
- jpa
- backend
- MSA
- 티스토리챌린지
- QueryDSL
- Spring Boot
- spring
- nosql
- orm
- aws
- DynamoDB
- CodeCommit
- data
- backenddeveloper
- serverless
- goorm x kakao
- goorm
- s3
- Today
- Total
gony-dev 님의 블로그
Call by Value / Call by Reference 본문
지난 시간에는 JVM 내에서 사용되는 메모리 영역들인
Method Area, Heap Area, Stack Area를 알아보았다.
이번 시간에는 Java의 Call by Value와 Call by Reference에 대해 알아보자.
출처 - Inpa Dev
Java의 Call by Value / Call by Reference
자바에서 메서드를 호출할 때 파라미터를 전달하는 방법에는 두 가지가 존재한다.
1. Call by Value
2. Call by Reference
이는 프로그래밍 시 반드시 마주하게 되는 개념으로 함수의 매개변수에서 값을 복사하느냐 주소값을 참조하느냐에 따라
반환 결과가 달라지기 때문에 중요하다.
데이터형에 따라 동작 차이가 나는데,
자바의 데이터형을 먼저 알아보면 크게 두 가지로 나뉜다.
- 기본형(Primitive Type)
- Boolean Type - boolean
- Nemuric Tyep - int, short, long, double, char
- 참조형(Reference Type)
- Class Type, Interface Type, Array Type, Enum Type
예시 코드로 진행해보자.
public class MyClass {
public static void main(String[] args){
int num = 0;
int[] arr = { 0 };
add_num(num);
add_arr(arr);
System.out.println("num의 값은 " + num + "입니다.");
System.out.println("arr[0]의 값은 " + arr[0] + "입니다.");
}
static void add_num(int num){
num += 100;
}
static void add_arr(int[] array){
array[0] += 100;
}
}
위의 코드의 출력 결과는 다음과 같다.
num의 값은 0입니다.
arr[0]의 값은 100입니다.
위의 처리 결과가 바로 Call by Value와 Call by Reference가 일어난 것이다.
1. Call by Value
Call by Value는 메서드를 호출할 때 값을 넘겨주기 때문에 Pass by Value라고도 불린다.
메서드를 호출하는 호출자의 변수와 호출 당하는 수신자의 파라미터는 복사된 서로 다른 변수이다.
그러므로 값만 전달하기 때문에 수신자의 파라미터를 수정해도 호출자의 변수에는 아무런 영향이 없다.
2. Call by Reference
Call by Reference는 주소를 직접 넘기기 때문에 호출자의 변수와 수신자의 파라미터는 완전히 동일한 변수이다.
그러므로 메서드 내에서 파라미터를 수정하면 그대로 원본 변수에도 적용이 된다.
코드를 다시 살펴보며 알아보도록 하자.
먼저 num 변수는 Primitive Type이고, arr 배열 변수는 Reference Type으로 선언된다.
arr 배열 변수의 실제 데이터는 heap 영역에 저장되어 이를 참조할 주소값을 지니게 된다.

후에 add_num 메서드를 호출하면 add_num의 스택 프레임이 생성되며 메서드 내의 지역 변수 num에 100을 더하게 된다.
이때 add_num 스택 프레임 내에 있는 지역 변수 num의 값이 바뀐 것이지 main 스택 프레임 내의 num의 값이 바뀐 것이 아니다.
매개변수인 num은 그저 main의 num으로부터 원시값을 복사하여 받았기 때문이다.
이게 바로 call by value이다.
다시 말해 add_num의 지역 변수인 num과 main의 num은 상관없는 별개의 객체라는 것이다.
arr에 대한 경우는 다르다.
add_arr을 호출하는데 같은 방식으로 add_arr 스택 프레임이 생성되고 매개변수인 array가 생성된다.
add_num처럼 변수의 값이 복사되어 파라미터에 넘겨지게 되는데, 이때 arr 변수가 들고있는 값은 '원시값'이 아닌 '주소값'이다.
즉, arr의 주소값이 매개변수로 넘겨지게 되어 add_arr에서의 값 변경은 힙 영역의 주소 참조 데이터를 변경하게 되는것이다.
Call by Reference 개념이 없는 Java

사실 자바 프로그래밍에서는 call by reference가 존재하지 않는다.
그 이유는 C 언어와 달리 포인터를 숨겨 개발자가 직접 메모리 주소에 접근하지 못하게 막아놓았기 때문이다.
(C언어는 '*' 과 '&' 기호를 통해 주소 접근이 가능하다!)
자바 프로그래밍은 매개변수의 복사된 값에 따라 동적으로 연산을 수행한다고 보면 된다.
'JVM' 카테고리의 다른 글
| 클래스 로드 및 초기화 시점 (0) | 2025.12.22 |
|---|---|
| 자바 코드의 메모리 영역 (1) | 2025.12.10 |
| Garbage Collection Tuning (0) | 2025.12.08 |
| Garbage Collection 동작 원리 및 종류 (0) | 2025.12.04 |
| JVM 내부 구조 & 메모리 영역 (0) | 2025.12.01 |