1. Call by Value와 Call by Reference란?
Call by Value란 값에 의한 호출을 의미합니다. 함수에 값을 전달할 때 값을 복사해서 전달하고, 전달한 값을 변경하여도 원본은 변경되지 않습니다.
Call by Reference란 참조에 의한 호출을 의미합니다. 함수에 값을 전달할 때 참조 값을 전달하게 됩니다.
2. 자바에서 Call by Value의 동작방식
자바의 데이터 타입은 크게 두 가지로 나누어집니다.
- 원시타입 - byte, short, int, float, long, double, char, boolean
- 참조타입 - Class, interface, Array, Enum 등등
메소드 파라미터로 원시 타입과 참조 타입을 전달하며 일어나는 동작 방식을 보며 자바가 어떻게 Call by Value방식을 사용하는지 알아보겠습니다.
2-1 원시타입
class Main {
public static void main(String[] args) {
int a = 100;
add(a);
System.out.println("메소드 실행 후 a값 : " + a);
}
static void add(int num) {
num++;
}
}
메소드 실행 후 a값 : 100
위 코드는 원시타입으로 선언된 변수를 add 함수를 통해 1을 더해주고 있습니다. 하지만 결과는 그대로 100으로 출력되는데 그 이유를 아래 그림을 통해 알아보겠습니다.
자바에서 원시타입은 Stack 영역에 할당이 됩니다. 이 때 add메서드를 호출할 때 자바는 값을 복사해서 전달하기 때문에 a의 값이 복사되어 num에 전달되게 됩니다.
그리고 이 num의 값을 증가하게 되므로 메소드 실행 후 a의 값은 변함 없이 100으로 유지됩니다.
2-2 참조타입
class Main {
public static void main(String[] args) {
int[] a = { 100 };
add(a);
System.out.println("메소드 실행 후 a[0]값 : " + a[0]);
}
static void add(int[] arr) {
arr[0]++;
}
}
메소드 실행 후 a[0]값 : 101
자바에서 참조 타입은 힙 영역에 할당 됩니다. 해당 배열은 힙 영역에 할당되고 이 배열을 가리키는 변수는 Stack 영역에 생성됩니다. (변수의 참조 값을 복사 후 전달해 a와 arr은 동일한 객체의 주소를 바라보게 됩니다.)
메소드를 실행한 결과 같은 주소를 참조하고 있기 때문에 값이 변경된 것을 볼 수 있습니다.
전달된 것은 객체 참조 값의 복사본이기 때문에 참조된 객체의 상태는 변경될 수 있지만, 변수 자체가 가리키는 참조값은 변경되지 않습니다.
3.총정리
자바는 모든 메서드 호출 시 Call by Value 방식을 사용합니다. 원시 타입의 경우 값 자체를 복사하여 전달하고, 참조 타입의 경우 객체의 참조 값을 복사하여 전달합니다. 이로 인해 참조 타입의 객체 상태는 메서드 내에서 변경될 수 있지만, 이는 참조 값이 복사된 후 참조된 객체의 상태를 변경한 결과일 뿐 참조 값 자체는 Call by Value에 의해 전달됩니다.
자바를 만드신 고슬링님의 이야기를 끝으로 마무리하겠습니다.
어떤 사람들은 객체가 참조로 전달(by reference)된다고 잘못 말한다. 프로그래밍 언어 설계에서 참조 전달(pass by reference)은 인수가 함수에 전달될 때 그 값의 복사본이 아니라 원래 값의 참조를 전달받음을 의미한다. 만약 함수가 전달받은 매개변수를 변경하면 함수를 호출한 코드도 동일한 메모리 슬롯을 사용하므로 값이 변경되어야 한다. 자바는 객체를 참조로 전달하지 않는다(not pass objects by reference). 대신 객체에 대한 참조를 값으로 전달한다(passes object references by value). 실제 객체를 가리키는 참조의 두 복사본이 동일한 객체를 가리키기 때문에, 한 참조를 통해 만들어진 변경이 다른 참조를 통해서도 보이는 것이다. 자바에는 명확하게도 값을 전달(pass by value)하는 방식만 존재하며, 이것이 단순함을 유지할 수 있게 해준다.
참고
☕ 자바는 Call by reference 개념이 없다 ❓
자바의 Call by Value / Call by Reference 프로그래밍을 하다보면 반드시 마주치는 것이 바로 call by value / call by reference 개념이다. 함수의 매개변수에서 값을 복사하느냐 주소값을 참조하느냐에 따라 반
inpa.tistory.com
'JAVA' 카테고리의 다른 글
[JAVA] 가비지 컬렉션 2편 (알고리즘) (0) | 2024.06.04 |
---|---|
[JAVA] 가비지 컬렉션이란? (Garbage Collection) 1편 (0) | 2024.06.04 |
[JAVA] 래퍼 클래스(Wrapper Class)란? (0) | 2024.05.31 |
[JAVA] ENUM 이란? (0) | 2024.05.28 |
[JAVA] JVM(Java Virtual Machine) (0) | 2023.07.11 |