개발자허허의 오늘은 뭐 먹지?

[JAVA] JAVA는 Call by Value일까 Call By Reference일까? 본문

Dev/자세히 알아보기

[JAVA] JAVA는 Call by Value일까 Call By Reference일까?

duck67 2021. 5. 31. 00:31
반응형

Call by Value는 함수가 호출될 때 값을 전달해주고, Call by Reference는 함수가 호출될 때 주소를 전달해준다.

그래서 Call by Value는 호출한 함수안에서 값을 어떻게 지지고 볶든 local value의 성격을 지니기 때문에 함수가 종료한 후에 값이 변화되지 않지만, Call by Reference는 주소를 바로 참조하기 때문에 호출한 함수에서의 변경이 함수가 종료된 이후에도 남는다.

 

그런데 JAVA는 int, float, double등 primitive type에 대해서는 Call by Value이고, array나 class instance등은 Call by Reference로 작동한다라고들 한다. 이게 무슨 이야기인지, 아래 예제를 보도록 하자.

public class CallByValueTest {
    public static void main(String args[]) {
        Obj o1 = new Obj(1);
        Obj o2 = new Obj(2);
        System.out.println("Before changeValue() ==> " + o1.value + "," + o2.value);
        changeValue(o1, o2);
        System.out.println("After changeValue() ==> " + o1.value + "," + o2.value);
    }
    public static void changeValue(Obj o1, Obj o2) {
        o1.value = 3;
        o2 = o1;
    }
    static class Obj {
        int value;
        Obj(int i) {
            this.value = i;
        }
    }
}

실행결과는 아래와 같다.

changeValue()를 실행하고나서 뭔가 좀 이상하지 않은가?

분명 자바에서 class instance를 파라미터로 넘기면 Call by Reference로 작동한다고 했는데, 

o1만 변경되고 o2는 변경되지 않았다.

 

그 이유는 다음과 같다.

1. changeValue() 가 호출될 때 o1, o2는 "주소의 값"이 넘어간다. (주소가 아님)

2. Call by Value로 작동하여, changeValue() 함수 안에서 "주소의 값"이 복사된다. 즉, o1, o2와 동일한 "주소의 값"이 JVM의 Stack에 복사되었다.

3. 그리고 o1.value = 3 할 때는, changeValue() 함수에 진입하면서 새로 만들어진 o1의 "주소의 값"이 참조하고 있는 heap 주소에 가서 값을 바꾼다. 즉, 실제 객체의 값 자체가 변경된 것이다.

4. o2 = o1 할 때는 changeValue() 함수에 진입하면서 새로 만들어진 o1, o2의 "주소의 값"의 복사본끼리 연산이 수행된다. 즉, 해당 메소드가 종료되면 local value와 마찬가지로 값의 변화가 없게되는 것이다.

 

그러면 JAVA는 Call by Value일까 Call by Reference일까?

JAVA는 Call by Value가 기본 작동 방식이고, 주소를 참조하는 타입의 경우 Call by Reference로 작동하는 것 처럼 보이게 되지만, 안그런 경우도 있다. 정도로 뜨뜨미지근하게 결론을 내리면 될 것 같다. 자바에서의 Call by Reference는 reference value를 뜻 하는 것이라서 자바에는 Call by Value만 있고, 대신 reference value를 보내줄 수 있어서 호출된 쪽에서 값을 변경할 수 있다가 맞다라고 한다.

https://www.facebook.com/tobyilee/posts/10222585502760852

 

반응형
Comments