[Java] Call By Value, Call By Reference

wujin·2023년 8월 31일
0

Call By Value와 Call By Reference

Call By ValueCall By Reference는 함수나 메소드에 인자를 전달할 때 사용되는 전달 방식을 나타내는 개념이다. Java는 이 둘 중 Call By Value에 해당하는 방식을 사용한다. 그러나 Java에서는 이해를 돕기 위해 Call By Value와 유사한 개념인 Call By Sharing을 사용한다고도 설명되기도 한다.

Call by Value

Call By Value는 함수나 메소드에 인자를 전달할 때, 해당 인자의 값을 복사하여 전달하는 방식을 의미한다. 함수 내에서 매개변수는 전달된 값의 복사본을 가지고 작업하며, 원본 변수의 값은 변경되지 않는다.

예제

public class Example {
    public static void main(String[] args) {
        int num = 10;
        modifyValue(num);
        System.out.println("변경 후 num 값: " + num); // 출력 결과: 변경 후 num 값: 10
    }

    public static void modifyValue(int value) {
        value = 20;
    }
}

위의 예제에서 modifyValue 메소드에 num 변수를 전달하면, 해당 메소드 내부에서 value 매개변수의 값이 변경되더라도 원본 변수인 num의 값은 변경되지 않는다. 이는 Call By Value 전달 방식의 특성이다.

Call by Reference (Call By Sharing)

Call By Reference는 인자의 참조(메모리 주소)를 전달하는 방식을 의미한다. 호출된 함수나 메소드 내에서 매개변수를 통해 원본 변수에 접근하면, 원본 변수의 값이 변경될 수 있다. 그러나 Java에서는 엄밀히 말해 Call By Reference보다는 Call By Sharing에 더 가까운 방식을 사용한다. Call By Sharing객체의 메모리 주소를 복사하여 전달하는데, 이 때 원본 객체의 상태를 변경할 수는 있지만 새로운 객체로 교체하거나 원본 객체의 참조를 변경할 수는 없다.

Java의 전달 방식은 실제로 Call By Value이지만, 참조 타입(Reference Types)의 변수를 전달할 때는 변수가 가리키는 객체의 주소가 복사되어 전달되기 때문에 객체의 상태를 변경할 수 있다. 그러나 객체의 주소 자체는 변경되지 않는다.

따라서 Java에서는 값을 복사하여 전달하는 Call By Value 방식을 사용하며, 참조 타입을 전달할 때 객체의 주소를 복사하여 전달하여 객체의 내부 상태를 변경할 수 있다. 이 때문에 Java에서는 Call By ValueCall By Sharing의 특성을 혼합한 전달 방식을 사용한다고 볼 수 있다.


참고 자료

https://shanepark.tistory.com/380

0개의 댓글