[Java] Call By Reference와 Call By Value

자바에서 메소드를 호출할 때 파라미터를 전달하는 방법에는 call by reference와 call by value라는 두 가지 방법이 존재하는데 각각에 대해서 알아보자.

 

우선 call by reference와 call by value의 주요한 차이점은 메서드 내에서 데이터(파라미터)가 전달되고 수정되는 방식이다.

 

Call By Value


우선 값에 의한 호출(call by value)은 메서드 호출 시 파라미터로 전달되는 변수 값의 복사본이 메서드에 전달되는 것을 의미한다. 다시 말해서, 메서드 호출 시 전달된 파라미터 값은 메서드 안에서 값이 변경되더라도 원래 값(파라미터)에 영향을 주지 않는다는 것을 의미한다.

 

복사본이 메서드에 전달된다는 것이 무슨 말인지 이해가 안 된다면 아래 예시 코드를 보면 쉽게 이해할 수 있을 것이다.

 

Call By Value 예시 코드

public class CallByValue {
    public static void main(String[] args) {
        int number = 10;
        increment(number);
        System.out.println("number = " + number);
        // number = 10
    }

    public static void increment(int number) {
        number = number + 1;
    }
}

파라미터로 전달된 값을 1 증가시키는 increment 메서드를 만들고 초깃값이 10인 number를 전달시켜 출력해 보면 11이 예상되지만 결과는 10이 출력이 된다.

 

그 이유가 increment 메서드 호출 시 전달된 파라미터 값인 number(10)는 복사본이 만들어져서 메서드 안에서만 변경이 되고 원본(number)은 변경이 되지 않아 10이 출력이 되는 것이다. 

 

 

Call By Reference


참조에 의한 호출(call by reference)은 메서드 호출 시 파라미터로 전달되는 변수 값의 레퍼런스를 전달되는 것을 의미한다.

즉, 메서드 내 변수가 변경이 되면 call by value와 다르게 원래 변수에 영향을 미친다는 의미이다.

 

원래 변수에 영향이 미치는지 예시 코드를 보자.

 

Call By Reference 예시 코드

public class CallByReference {
    public static void main(String[] args) {
        int[] numbers = {10};
        increment(numbers);
        System.out.println("number = " + numbers[0]);
        // number = 11
    }

    private static void increment(int[] numbers) {
        numbers[0] = numbers[0] + 1;
    }
}

위의 예시 코드에서 숫자를 증가하는 메서드는 배열 매개변수(numbers)를 참조로 사용한다. increment 메서드를 호출하면 배열에 대한 복사본이 전달되는 것이 아니라 메서드에 주소를 전달하여 참조하게 된다.

그래서 메서드 내에서 첫 번째 요소 값을 1 증가시키게 되면 원래 배열의 첫 번째 요소 값도 1이 증가가 된다. 즉, 원본 numbers 배열 값에 영향을 미치게 된다.

 

정리


call by reference와 call by value의 차이점을 정리해 보면 call by value는 메서드 호출 시 파라미터 값의 복사본을 메서드에 전달하는 방식이고 call by reference는 파라미터의 값에 대한 주소를 전달하여 참조하게 된다.

 

하지만 사실 자바에서는 call by reference는 지원하지 않는다고 한다. 객체 참조가 메서드로 전달되는 경우에도 참조의 복사본은 객체 자체가 아닌 값으로 전달된다. 이 말은 메서드 내의 객체에 대한 변경이 원래 객체에 영향을 미치긴 하지만 참조 자체는 값에 의해 전달된다는 것을 의미한다.

 

'Java' 카테고리의 다른 글

[Java] 제네릭(Generic)이란?  (1) 2023.02.28
[Java] Checked Exception과 Unchecked Exception  (2) 2023.02.27
가비지 컬렉션(Garbage Collection)이란?  (0) 2023.01.03
JVM(Java Virtual Machine)이란?  (0) 2023.01.01
배열  (0) 2022.05.22