Call by Value, Call by Reference

Call by Value"와 "Call by Reference"의 차이

  • Call by Value: 값이 복사되어 전달되며, 함수 내에서 값을 변경해도 원본 변수에 영향을 주지 않는다.

  • Call by Reference: 주소(참조)가 전달되어, 함수 내에서 값을 변경하면 원본 변수도 변경된다.

  • "참조값을 받는다"라는 표현과 "참조(즉, 주소)를 인자로 받는다"라는 표현은 비슷해 보이지만, 사용되는 컨텍스트에 따라 의미가 달라진다.

void changeValue(int &ref) {
    ref = 20;
}

int main() {
    int x = 10;
    changeValue(x);
    // x 값은 20으로 변경된다.
    return 0;
 }
 fun shuffleList(list: MutableList<Int>) {
     list.shuffle()
 }

 fun main() {
     val a = mutableListOf(1, 2, 3, 4, 5)
     // a 리스트가 무작위로 섞인다.
     shuffleList(a)
 }

Java는 기본적으로 "Call by Value" 방식을 사용하며, 이는 메서드에 값을 전달할 때 해당 값이 복사되어 전달된다는 것을 의미한다.

이 방식은 기본 데이터 타입의 경우 실제 값이 복사되어 전달되고, 객체 참조의 경우 참조값(즉, 주소를 가리키는 값)이 복사되어 전달된다.

따라서 메서드 내에서 참조 자체(즉 주소를 가리키는 값을) 변경해도 그 변경 사항은 완전히 로컬 범위로 제한되며 외부에 영향을 미치지 않는다. 그러나 복사된 참조를 통해 원본 객체의 상태를 변경하는 것은 가능하므로, 이런 동작은 종종 Call by Reference처럼 보일 수 있다.

하지만 엄밀히 말해 Java에서 "Call by Reference"라고 하는 것은 정확하지 않으며, 더 정확한 표현은 "Pass References by Value" 또는 "Call by Value of the Reference"이다. 결국 Java에서 객체를 메서드에 전달할 때 그것은 Call by Value 방식으로 작동하며, 이 때 전달되는 값은 해당 객체의 참조값(주소를 가리키는 값)인 것이다.

profile
클린코드와 UX를 생각하는 비즈니스 드리븐 소프트웨어 엔지니어입니다.

0개의 댓글