Java

call by value

voider 2022. 9. 14. 15:52

우연히 https://www.facebook.com/tobyilee/posts/10222585502760852 이 글을 읽고 지금까지 Call by reference와 Call by reference에 대해 잘못 알고 있었다는 사실을 알았다.
지금까지는 Java에서 call by value는 기본 타입 호출, call by reference는 그 외 모든 레퍼런스 타입을 호출할 때 사용한다고 알고 있었지만, 사실은 Java는 모두 call by value로 동작한다. call by reference에서 말하는 by reference와 Java에서 말하는 reference value는 다르다.

Call by value가 뭔가?

함수가 호출되면 메모리에서 함수를 위한 임시 공간을 할당한다.
Call by value는 함수 호출 시 전달하는 파라미터를 복사해서 인자로 전달한다.
복사된 인자는 함수 안에서 지역적으로 사용하므로 local value 속성이다.
지역 변수로 인식하기 때문에 함수 안에서 값을 변경하더라도 원래 객체는 변하지 않는다.

Alpabet a = new A();

someFun(a) {
    a = new B();
}

위 예제에서

  1. a 변수에 A 객체를 생성해서 someFun() 메소드로 넘겼다.
  2. someFun() 안에서 a의 값을 B 객체로 변경했다.

하지만 이것은 a라는 변수가 참조하는 값이 달라지는 것이지, A라는 원객체를 수정하는 것이 아니다. 이것을 call by value라고 한다.

Call by Reference는 실제 참조를 인자로 넘기기 때문에 실제 원본 객체를 변경할 수 있지만 Java는 항상 call by value로 값을 넘기기 때문에 원본 객체에 접근할 수는 있으나 변경할 수 없다.

Call by reference는 참조를 그대로 넘기기 때문에 원본을 수정할 수 있고, 이것은 조금 위험할 수도 있다. 하지만 추가 메모리를 사용하지 않는다는 장점도 있다. Call by value는 추가 메모리를 사용하는 대신, 좀더 안정성을 높일 수 있다는 장점이 있다.

참고:
Call by value와 Call by reference | 👨🏻‍💻 Tech Interview