Java에는 call by reference가 없다.

안석우(문과대학 철학)·2025년 1월 31일
0

JAVA

목록 보기
11/11

참조:
https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%9E%90%EB%B0%94%EB%8A%94-Call-by-reference-%EA%B0%9C%EB%85%90%EC%9D%B4-%EC%97%86%EB%8B%A4-%E2%9D%93
https://loosie.tistory.com/486

call by reference = 변수가 하나 더 생기는 게 아니라 별칭이 하나 더 생길뿐!

#include <iostream>
using namespace std;

void modify(int &x) { // x는 a의 참조
    x = 10; // x를 통해 원래 변수의 값을 변경
}

int main() {
    int a = 5;
    modify(a); // a의 주소가 전달됨
    cout << "a: " << a << endl; // a는 이제 10
    return 0;
}

여기서 modify(a)할 때 x에 a의 참조가 넘어간다
이게 무슨 소리냐? a라는 변수의 메모리 주소가 0x01이라고 하면, x라는 변수는 0x02이런 식의 메모리를 할당 받아서 그 안에 0x01을 넣는 게 아니라, x에는 새로운 메모리 할당이 안 된다. x는 그냥 a의 또다른 이름일 뿐이다. 이게 참조가 넘어간다는 것의 의미다.

class Data {
    int value;
}

class Test {
    static void modifyValue(Data d) {
        d.value = 100; // 객체의 필드값을 변경
    }

    public static void main(String[] args) {
        Data obj = new Data();
        obj.value = 10;
        
        modifyValue(obj);
        System.out.println("변경된 값: " + obj.value); // 출력: 변경된 값: 100
    }
}

반면 java의 위의 예시코드에서는 d에 새로운 메모리가 할당된다.
obj의 주소가 0x01이라고하고 0x01메모리에 저장된 값이 0x02(실제 인스턴스의 주소)라고 하자.
modifiyValue(obj)에서는 d라는 변수에 0x03이라는 주소의 메모리가 할당되고 0x03의 메모리에는 obj의 값인 0x02가 전달되어 d는 0x02를 값으로 저장한다. 그렇기에 d.value는 obj.value의 값을 수정한다.
즉, d는 obj의 또다른 이름이 아닌 것이다.

그래서

static void modifyValue(Data d) {
		d = new Data();
        d.value = 100; // 객체의 필드값을 변경
    }

이렇게 코드가 바뀌면 obj.value는 변하지 않는다. 만약 call by reference에 의해 d가 obj의 또다른 이름이었다면 obj의 value는 100으로 바뀌었을 것이다.

0개의 댓글