본문 바로가기

Java

Call by Value / Call by Reference

자바에서 메소드를 호출할 때 파라미터를 전달하는 방법에는 크게 두 가지가 있습니다. 이는 값에 의한 전달(Call by Value)과 참조에 의한 전달(Call by Reference)입니다. 각각의 전달 방식에 대해 설명하고, 샘플 코드를 통해 자세히 알아보겠습니다.

1. 값에 의한 전달 (Call by Value):
값에 의한 전달은 메소드에 파라미터로 전달되는 값의 복사본을 전달하는 방식입니다. 메소드 내에서 전달된 값을 변경하더라도 원본 변수에는 영향을 주지 않습니다.

아래는 값에 의한 전달의 예시 코드입니다:

public class Main {
    public static void main(String[] args) {
        int x = 10;
        System.out.println("Before method call: " + x);
        changeValue(x);
        System.out.println("After method call: " + x);
    }

    public static void changeValue(int value) {
        value = 20;
        System.out.println("Inside method: " + value);
    }
}

출력 결과:

Before method call: 10
Inside method: 20
After method call: 10

위의 예시에서 `changeValue` 메소드는 `value`라는 파라미터를 갖고 있습니다. `changeValue` 메소드는 전달받은 `value`의 값을 20으로 변경하고 출력합니다. 하지만 `main` 메소드에서 `x`를 출력해보면 메소드 호출 전후로 값이 변하지 않음을 확인할 수 있습니다. 이는 `changeValue` 메소드에 `x`의 복사본이 전달되었기 때문입니다.

2. 참조에 의한 전달 (Call by Reference):
참조에 의한 전달은 메소드에 파라미터로 전달되는 변수의 참조를 전달하는 방식입니다. 이 경우 메소드 내에서 전달된 참조를 통해 변수의 값을 변경할 수 있으며, 변경된 값은 원본 변수에도 영향을 줍니다.

아래는 참조에 의한 전달의 예시 코드입니다:

public class Main {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        System.out.println("Before method call: " + Arrays.toString(arr));
        changeArray(arr);
        System.out.println("After method call: " + Arrays.toString(arr));
    }

    public static void changeArray(int[] array) {
        array[0] = 10;
        System.out.println("Inside method: " + Arrays.toString(array));
    }
}

출력 결과:

Before method call: [1, 2, 3]
Inside method: [10, 2, 3]
After method call: [10, 2, 3]

위의 예시에서 `changeArray` 메소드는 `array`라는 int 배열을 파라미터로 받습니다. `

changeArray` 메소드는 배열의 첫 번째 요소를 10으로 변경하고 출력합니다. `main` 메소드에서 배열을 출력해보면 메소드 호출 이후에도 배열의 값이 변경되었음을 확인할 수 있습니다. 이는 `changeArray` 메소드에 배열의 참조가 전달되었기 때문입니다.

이와 같이 자바에서는 값에 의한 전달과 참조에 의한 전달 두 가지 방식을 사용하여 메소드에 파라미터를 전달할 수 있습니다. 각각의 방식은 다른 동작을 하며, 이를 이해하고 적절하게 사용하는 것이 중요합니다.

'Java' 카테고리의 다른 글

Abstract  (0) 2024.04.08
String Class  (0) 2024.04.08
try-catch-finally  (0) 2024.04.08
Anonymous Class  (0) 2024.04.08
Nested Classes(중첩 클래스)  (0) 2024.04.08