[Java] Java는 Call by Value인가? Reference 인가?

윤재열·2022년 6월 11일
0

Java

목록 보기
54/71

Java 는 Call by Value 인가, Call by Reference 일까에 대해서 다시 한번 생각해 보았습니다.

Call by Value 란?

  • 해석 그대로 값을 호출하는 것을 의미합니다.
  • 전달받은 값을 복사하여 처리합니다.
  • 즉, 전달받은 값을 변경하여도 원본은 변경되지 않습니다.

Call by Referernce란?

  • 우리는 Java 객체를 전달받고, 그 객체를 수정하면 원본도 같이 수정되니 이것을 Call by Reference 라고 생각했을 수도 있습니다.

예를 들기 위해 클래스를 만들어 보겠습니다.

package org.demo.lab;

import net.minidev.json.JSONUtil;


class A{
    public int value;

    public A(int value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return "A{" +
                "value=" + value +
                '}';
    }
}

public class callByValue {

    public static void main(String[] args) {
        A a1 = new A(1);
        A a2 = new A(2);

        run(a1,a2);
        System.out.println("a1 : "+a1.toString());
        System.out.println("a2 : "+a2.toString());
    }
    public static void run(A arg1,A arg2){
        arg1.value = 111;
        arg2 = arg1;
    }


}

  • 여기서 주의 깊게 봐야 하는 부분은 a1의 value 가 111로 변경된 것입니다.
  • arg1의 value를 변경하니 원본 a1의 값도 변경되었으니 이것을 call by Reference라고 헷갈리는 것입니다.
  • 하지만 a1 에서 arg1으로 매개변수를 넘기는 과정에서 직접적인 참조를 넘긴 것이 아닌, 주소값을 복사해서 넘기기 때문에 이는 call by Value 입니다.
  • 복사된 주소 값으로 참조가 가능하니 주소 값이 가리키는 객체의 내용이 변경되는 것입니다.

JVM 메모리 레벨로 코드가 진행되는 것을 확인

  • main 에서 a1,a2를 만든 부분 까지 진행했을 때 JVM 메모리입니다.

  • 그리고 run 메서드가 실행되며 매개변수를 전달 받으면 다음과 같이 됩니다.
  • arg1은 a1 이 가지고 있는 주소값을 복사하여 독자적으로 가지게 됩니다.
  • arg2도 마찬가지로 a2가 가지고 있는 주소 값을 복사하여 독자적으로 가지고 있게 됩니다.
  • 즉, 주소 값을 복사하여 가져가는 call by Value 가 발생한 것입니다.

  • 여기서 arg1을 통해 value의 값을 변경한다면 arg1이 가지고 있는 주소 값을 통해 객체의 값을 변경하게 됩니다.

  • arg2에 arg1의 값을 저장한다고 해도 이는 run 메서드 내에 존재하는 arg2가 arg1이 가진 주소값을 복사하여 저장하는 것일 뿐 원본 a2와는 독립된 변수이기 때문에 원본 a2 는 변경 되지 않습니다.

  • 즉, Java 는 기본적으로 모든 전달 방식이 Call By Value 입니다.

profile
블로그 이전합니다! https://jyyoun1022.tistory.com/

0개의 댓글