[Java] Call by Value, Call by Reference

김머랭·2024년 1월 7일

Java

목록 보기
4/5

Call by Value? Call by Reference?


"Call by value"와 "call by reference"는 프로그래밍 언어에서 함수 호출 시 인수를 전달하는 방식을 나타내는 용어입니다.

Java에서 Call by value

  • 자바에서 기본 데이터 타입(primitive types)을 매개변수로 전달할 때는 해당 값의 복사본이 전달됩니다.
  • 예를 들어 int, float, boolean 등과 같은 기본 데이터 타입을 함수에 전달하면 함수 내에서 값을 변경해도 호출한 쪽에는 영향을 주지 않습니다.

public class CallByValueExample {
    public static void changeValue(int x) {
        x = 5;
    }

    public static void main(String[] args) {
        int a = 3;
        changeValue(a);
        System.out.println(a); // 출력 결과는 3입니다. 함수 내에서 x 값 변경이 a에 영향을 주지 않습니다.
    }
}

Java에서 Call by reference로 값 전달

  • 자바에서는 객체(참조 타입)를 매개변수로 전달할 때, 해당 객체의 참조(주소)가 복사되어 전달됩니다. 이는 함수 내에서 객체의 상태를 변경할 수 있음을 의미합니다.

import java.util.ArrayList;

public class CallByReferenceExample {
    public static void changeList(ArrayList<Integer> list) {
        list.add(4);
    }

    public static void main(String[] args) {
        ArrayList<Integer> myList = new ArrayList<>();
        myList.add(1);
        myList.add(2);
        myList.add(3);

        changeList(myList);
        System.out.println(myList); // 출력 결과는 [1, 2, 3, 4]입니다. 함수 내에서 list를 변경하여 호출자에도 영향을 줍니다.
    }
}

요약하자면, 자바에서는 기본 데이터 타입을 전달할 때는 값이 복사되어 전달되고, 객체(참조 타입)를 전달할 때는 참조의 복사본이 전달되어 객체의 내용을 변경할 수 있습니다.



자바는 Call by Value


자바는 "call by value"입니다. 이는 메소드에 매개변수를 전달할 때, 기본 데이터 타입(primitive types)의 경우 값의 복사본을 전달하고, 객체(참조 타입)의 경우에는 참조(주소)의 복사본을 전달한다는 것을 의미합니다.

만약 메소드에 객체(참조 타입)를 전달할 때, 해당 객체를 변경하면 호출자(caller)에서도 변경 내용이 반영되는데, 이는 객체의 참조(주소)가 복사되어 전달되기 때문입니다. 그러나 이것은 결국 메소드에 전달되는 것이 참조의 복사이며, 이것은 Java에서의 "call by reference"가 아니라 "call by value"의 일종으로 이해됩니다.

중요한 점은 객체(참조 타입)를 전달할 때 참조(주소)의 복사본이 전달되어, 객체의 상태를 변경할 수 있다는 점입니다. 하지만 메소드 안에서 새로운 객체를 할당하거나 참조를 다른 객체로 변경하는 것은 호출자에게 영향을 미치지 않습니다. 이러한 특성 때문에 자바는 "call by value"로 분류됩니다.

profile
"어?~" 왜 안돌아가지.. "어?~" 왜 돌아가지..

0개의 댓글