백엔드 개발자 블로그

Call by Value & Call by Reference 본문

Java

Call by Value & Call by Reference

backend-dev 2024. 5. 14. 23:55

Java의 참조형 변수는 Call by Reference인 줄 알았는데, Java는 Call by Value만 지원한다고 한다. 자세히 알아보자. 

 

img

https://www.youtube.com/watch?v=kCiNYzHuIX8&ab_channel=Log2Base2

Call by Value

  • 함수를 호출할 때 인수의 을 복사하여 전달한다.
  • 함수 내에서 값을 변경하는 경우 복사된 값이 변경되는 것이니, 실제 값은 변경되지 않는다.
Class CallByValue {
    public static void swap(int x, int y) {
        int temp = x;
        x = y;
        y = temp;

    }

    public static void main(String[] args) {
        int a = 10;
        int b = 20;

        System.out.println("swap() 호출 전 : a = " + a + ", b = " + b);
        swap(a, b);
        System.out.println("swap() 호출 후 : a = " + a + ", b = " + b);
    }
}

// 결과값
// swap() 호출 전 : a = 10, b = 20
// swap() 호출 후 : a = 10, b = 20

 

 

Call by Reference

  • 메서드 호출 시 인수의 참조를 전달한다.
  • 호출된 메서드 내에서 원래 변수의 값을 직접 변경할 수 있다.

 

Java의 참조변수는 Call by Reference?

결론만 말하면 아니다. 

  • 함수 내에서 Wrapper Class의 멤버 변수를 변경하면 변경이 된다.
    • 이 때문에 참조변수는 Call by Value라고 착각한다.
    • 이는 단지 참조값(객체의 메모리 주소)를 알고 있기 때문에 가능한 것 뿐이다.
  • 참조 자체를 변경해도 원래의 참조에는 영향을 미치지 않는다.
    • 참조(Call By Reference)를 전달했으면 바뀌었다. 
    • 하지만, 참조값(Call By Value)을 전달했기에 바뀌지 않았다. 
public class Example {
    public static void main(String[] args) {
        MyObject obj = new MyObject();
        obj.value = 5;
        changeObject(obj);
        System.out.println(obj.value);  // 출력: 10

        resetObject(obj);
        System.out.println(obj.value);  // 출력: 10, 원래 객체는 그대로
    }

    public static void changeObject(MyObject obj) {
        obj.value = 10;  // 객체의 속성 변경
    }

    public static void resetObject(MyObject obj) {
        obj = new MyObject();  // 새로운 객체를 참조하도록 변경
        obj.value = 0;
    }
}

class MyObject {
    int value;
}

 


참고

'Java' 카테고리의 다른 글

Scanner vs BufferedReader  (0) 2024.05.19
Generic  (0) 2024.05.16
Garbage Collector  (0) 2024.05.13
Exception  (0) 2024.05.13
람다와 클로저  (0) 2024.05.11