Java/OOP

[OOP] Call by Value 와 Call by Reference

JoonYong 2024. 1. 28. 18:31

 

 

'Call by Value'와 'Call by Reference'에 대해 알아보겠습니다.

이 두 개념은 함수에 인자를 전달하는 방식에 대한 이해를 돕고, 자바 코드의 동작을 예측하는 데 도움이 됩니다.

 

1. Call by Value(값에 의한 호출)

'Call by Value'는 함수에 인자를 전달할 때 인자의 값만을 복사해서 전달하는 방식을 말합니다. 이 방식에서는 원본 변수의 값이 함수 내에서 변경되더라도, 원본 변수에는 영향을 주지 않습니다.

자바에서 원시 타입(primitive types) 변수를 전달할 때 'Call by Value' 방식이 적용됩니다. 예를 들어, 아래의 코드를 보겠습니다.

public class Main {
    static void updateValue(int value) {
        value = 30;
    }
    public static void main(String[] args) {
        int value = 20;
        System.out.println(value);  // 20
        updateValue(value);
        System.out.println(value);  // 20
    }
}

이 코드를 실행하면 콘솔에는 업데이트 전후 둘다 '20'이 출력됩니다. updateValue 메소드 내에서 value 변수의 값을 변경했지만, 이것은 복사된 값에 대한 변경이므로 원본 value 변수에는 영향을 주지 않습니다.


2. Call by Reference( 참조에 의한 호출)

'Call by Reference'는 함수에 인자를 전달할 때 인자의 참조(즉, 메모리 주소)를 전달하는 방식을 말합니다. 이 방식에서는 함수 내에서 참조를 통해 원본 변수를 직접 변경할 수 있습니다.

c언어의 포인터

 

하지만 자바에서는 정확한 의미의 'Call by Reference'가 존재하지 않습니다. 대신, 객체를 전달할 때 참조의 값(즉, 참조를 가리키는 값)이 복사되어 전달되는 'Call by Value of Reference' 방식이 적용됩니다.

아래의 코드를 보겠습니다.

class Test {
    int value;
}

public class Main {
    static void updateValue(Test t) {
        t.value = 30;
    }
    public static void main(String[] args) {
        Test t = new Test();
        t.value = 20;
        System.out.println(t.value);  // 20

        updateValue(t);
        System.out.println(t.value);  // 30
    }
}

이 코드를 실행하면 콘솔에는 엡데이트 전: '20', 후:  '30'이 출력됩니다. updateValue 메소드에서 t 객체의 value 필드 값을 변경했고, 이 변경이 원본 객체에 반영되었습니다.

그러나 이것이 'Call by Reference'라고 말하는 것은 정확하지 않습니다. 왜냐하면 자바에서는 참조 자체를 변경하는 것이 불가능하기 때문입니다. 즉, 메소드 내에서 새로운 객체를 생성하여 원본 참조에 할당해도, 이 변경은 메소드 외부에는 영향을 주지 않습니다.

이해하기 쉽게 말하면, 'Call by Value'는 '값에 의한 호출'이며, 원본 데이터에 영향을 주지 않습니다. 반면에 'Call by Reference'는 '참조에 의한 호출'로 이해할 수 있지만, 자바에서는 정확히는 '참조 값에 의한 호출'이라고 볼 수 있습니다.

 

이렇게 'Call by Value'와 'Call by Reference'는 우리가 함수와 객체, 원시 타입을 다루는 방식에 큰 영향을 미칩니다. 이 개념들을 이해하면 자바 프로그래밍에 있어서 보다 효율적인 코드를 작성하는 데 도움이 될 것입니다.


3. C언어와 JAVA 비교

  Call by Value  Call by Reference Call by Value of Reference
개념 값의 복사본을 전달하며, 원본 변수에는 영향을 미치지 않음 메모리 주소를 전달하며, 함수 내에서 원본 변수를 변경 가능 참조의 값이 복사되어 전달되며, 함수 내에서 원본 객체를 변경 가능
C언어         가능 (원시 타입 변수) 가능 (포인터 사용) -
자바 가능 (원시 타입 변수) - 가능 (객체의 참조 전달)