JAVA/JAVA

[JAVA] Call by value, Call by reference?

Anna-Jin 2021. 11. 1. 16:30
728x90

https://perfectacle.github.io/2017/10/30/js-014-call-by-value-vs-call-by-reference/

 

(자알쓰) call by value vs call by reference

자알쓰란?자바스크립트 알고 쓰자. (잘 쓰자는 의미도 담겨있다.)자바스크립트라는 언어 자체는 내 기준에서는 설계 상 미스가 참 많다.함수 단위의 스코프, 호이스팅, 동적 타입 등등자바와 같

perfectacle.github.io

 

http://dhplanner.blogspot.com/2009/11/java-%EC%97%90%EC%84%9C%EC%9D%98-call-by-value-%EC%99%80-call-by.html

 

java 에서의 call by value 와 call by reference

자바에서는 진정한 call by reference는 없고 reference 값을 넘기는 것만 있다고 들었는데, 그 말을 이해하지 못하다가 이제서야 이해하게 되었다.   그 이해를 도와준 포스트가 아래 포스트이다.   ---

dhplanner.blogspot.com


Call by value vs Call by reference

 

간단하게 말하자면

Call by value는 값을 넘기는 것

Call by reference는 변수의 주소를 넘기는 것이다.

 

자바는 Call by value이기 때문에 서로 다른 공간 ( 클래스, 메소드 등등...)에서 선언된 변수는 다른 공간으로 공유되지 않는다. 값을 복사해서 저장하기 때문이다.

 

class Test {
    private static void swap(int a, int b) {
        int temp = a;
        a = b;
        b = temp;
    }

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

        System.out.println("a => " + a);
        System.out.println("b => " + b);

        swap(a, b);

        System.out.println("------- swap 후 -------");

        System.out.println("a => " + a);
        System.out.println("b => " + b);
    }
}

위의 스왑 예제를 보면

 

스왑된 a와 b 변수는 메인메소드의 a, b변수에 영향을 끼치지 않는 것을 볼 수 있다.

 

 

그렇다면 객체를 reference로 넘기는 방법은 없을까?

 

 

class Test {
    int value;

    Test(int value) {
        this.value = value;
    }

    private static void swap(Test a, Test b) {
        int temp = a.value;
        a.value = b.value;
        b.value = temp;
    }

    public static void main(String args[]) {
        Test a = new Test(1);
        Test b = new Test(2);

        System.out.println("a => " + a.value);
        System.out.println("b => " + b.value);

        swap(a, b);

        System.out.println("------- swap 후 -------");

        System.out.println("a => " + a.value);
        System.out.println("b => " + b.value);
    }
}

위의 예제처럼 값을 그대로 넘기는 것이 아니라 변수를 메모리에 담아서 넘기게 되면 reference로 넘기기가 가능하다!

 

출력된 값을 확인해봐도 제대로 a와 b의 값이 바뀐 것을 볼 수 있다.

728x90