[Java] call by value vs call by reference

devdo·2022년 1월 14일
0

Java

목록 보기
13/59
post-thumbnail

call by value (값에 의한 호출)

함수 호출 시 전달되는 변수(arguments)의 값(그러니까 사본이)을 복사하여 함수의 매개변수로 전달하는 것을 말한다.

나루토 분신술처럼 내모습을 복사하고 원래값은 놔두는 것이다.(자바의신 1권 209p)

Method1, Method2가 있다고 해보자.

    public void method_1() {
        int a = 10;
        int b = 5;
        
        method_2(a, b);	// arguments 전달인자
        
    }

    private void method_2(int a, int b) {	// 완전 새로운 변수임. 
        a = 20;
        b = 10;
        // method_1 의 전달인자 a, b와 완전 다른 지역변수임.
    }

자바에서는 Call by Value 방식을 수행할 때, 값을 넘겨받은 메소드에서
값을 복사하여 새로운 지역 변수에 저장하는 것이다.

이 때 Method_2는 Method_1의 변수를 사용한 것이 아니라, 자신이 새롭게 생성한 지역 변수에
복사한 Method_1의 변수 이름과 변수 값을 사용한 것이다.

이 때문에 아무리 Method_2에서 a와 b의 값을 바꾸어도 Method_1의 a, b에게
영향을 끼치지 않는다. 이 a, b 는 이름만 같을 뿐 별개의 메모리에 위치한 친구들이기 때문이다.


call by reference (주소에 의한 호출)

함수 호출 시 해당 reference 객체(메모리 주소를 담고있는 변수, 주소값)를 넘겨주는 것을 말한다.

만약 자바가 Call by Reference 방식을 사용한다면
a와 b에 영향을 끼칠 수 있게 된다. 왜냐면 이 둘은 다른 변수가 아니라 같은 주소를
공유하는 변수이기 때문
이다.

애초에 '참조 타입'인 이유가
Heap Memory 영역에 생성된 객체의 주소값을 참조하기 때문에 '참조 타입'이라고 불리는 것이다.
따라서 Method_1에서 Method_2로 넘겨준 건 객체의 주소값이고,
Method_1이 가지고 있는 주소값과 동일한 주소값을 가지고 이 객체의 상태를 변경하면

당연히 넘겨준 객체는 동일한 주소를 참조하기 때문에 변화시켜주면 영향을 주는 것이다!

어쨌든 call by reference 호출 방식도
call by value 처럼 값을 복사한 과정은 같다. 전달인자가 원시타입 value이냐 객체타입 value(주소값)이냐 다를 뿐이다.

그래서 자바는 call by value만 있다고 말하는 것이다.


얇은 복사&깊은 복사와는 관련이 없다.

얇은 복사 : 주소값을 복사해 버리는 것 = call by Ref ?
깊은 복사 : 값 자체를 복사해 버리는 것 = call by value ?

헷갈릴 수 있어서 기록해본다. 관련이 없다.



참고

https://velog.io/@ahnick/Java-Call-by-Value-Call-by-Reference

profile
배운 것을 기록합니다.

0개의 댓글