본문 바로가기
Java

값에 의한 호출(call by value) vs 참조 값에 의한 호출(call by value of the reference)

by Status Code 2024. 2. 18.

자바에서는 주로 두 가지 방식으로 메서드에 데이터를 전달합니다: 값에 의한 호출(call by value)과 참조 값에 의한 호출(call by value of the reference). 이 두 방식을 이해하면 자바의 기본적인 작동 원리를 더 잘 이해할 수 있습니다.

값에 의한 호출 (Call by Value)

값에 의한 호출에서는 변수의 실제 값을 메서드에 전달합니다. 이 경우, 메서드 내에서 변수 값을 변경해도 원래 변수의 값에는 영향을 주지 않습니다. 기본 데이터 타입(primitive data types)인 int, float, double 등이 이 방식으로 데이터를 전달합니다.

예제:

public class Test {
    public static void main(String[] args) {
        int x = 10;
        changeValue(x);
        System.out.println(x); // 출력: 10
    }

    public static void changeValue(int y) {
        y = 20;
    }
}

위 예제에서 changeValue 메서드는 x의 값을 변경하려고 시도하지만, x의 실제 값은 변경되지 않습니다. 여기서 x의 값이 changeValue 메서드로 복사되어 전달되기 때문입니다.

참조 값에 의한 호출 (Call by Value of the Reference)

자바에서는 모든 객체가 참조에 의해 전달됩니다. 이를 흔히 참조 값에 의한 호출이라고 하지만, 정확히는 메모리 주소의 복사본(즉, 참조 값)을 전달하는 것입니다. 따라서 메서드 내에서 객체의 상태를 변경하면, 원본 객체에도 영향을 미칩니다.

예제:

public class Test {
    public static void main(String[] args) {
        MyNumber myNum = new MyNumber();
        myNum.number = 10;
        changeValue(myNum);
        System.out.println(myNum.number); // 출력: 20
    }

    public static void changeValue(MyNumber num) {
        num.number = 20;
    }
}

class MyNumber {
    int number;
}

위 예제에서 changeValue 메서드는 MyNumber 객체의 number 필드 값을 변경합니다. 이 경우, myNum 객체의 실제 메모리 주소가 changeValue 메서드에 전달되므로, 메서드 내에서 객체의 상태를 변경하면 원본 객체에도 영향을 미칩니다.

정리

  • 값에 의한 호출 : 메서드에 변수의 실제 값을 복사하여 전달. 메서드 내에서 변수 값을 변경해도 원본 변수에 영향을 주지 않음.
  • 참조 값에 의한 호출 : 객체의 메모리 주소(참조 값)를 복사하여 메서드에 전달. 메서드 내에서 객체의 상태를 변경하면, 원본 객체에도 영향을 미침.

이 개념들을 이해하면 자바에서 데이터가 어떻게 전달되고, 메서드 내에서 변수와 객체가 어떻게 처리되는지 더 잘 이해할 수 있습니다.

댓글