[Java] 메소드 호출 방식

YounDitt·2020년 9월 24일
0

Java의 메소드 호출 방식

    public static void main(String[] args) {
        MyObject sample = new MyObject("sample");
        System.out.println(sample.text); //output : sample
        callByValue(sample);
        System.out.println(sample.text); //output : change 1
        callByReference(sample);
        System.out.println(sample.text); //expected : change 2 , actual : change 1

    }
    static void callByValue(MyObject obj){
        obj.text = "change 1";
    }
    static void callByReference(MyObject obj){
        obj = new MyObject("change 2");
    }

Java는 Call by value 이다.

  1. 필드 값 변경은 Call by reference같이 동작한다?
    -> 주소값이 아닌 주소를 복사한 값을 전달한다. 즉, 해당 객체와 연결된 메모리끼리의 복사가 아닌, 참조값만 복사하여 새로운 변수가 생성된다.
    같은 값을 참조하고 있기 때문에 마치 Call by reference처럼 필드값 변경이 가능하다.
  2. 새로운 객체를 함수에서 할당할 때 main의 sample 객체는 변경되지 않는다.

    Reference data type parameters, such as objects, are also passed into methods by value. (Oracle's Java Tutorials)

  1. Call by value (값에 의한 호출)
    메소드로 인자값을 넘길 때, 그 값을 복사하여 넘기기 때문에 메소드 내에서는 복사된 값으로 작업을 하고, 원래의 값을 변경시키지 않는다.

  2. Call by reference (참조에 의한 호출)
    메소드로 인자값을 넘길 때, 그 객체를 참조하는 주소를 넘기기 때문에 메소드 내에서 원래의 값에 접근이 가능하며 변경시킬 수 있다.

c++의 포인터와 비교

c++ : new를 이용하여 메모리를 생성하면 주소 그 자체를 직접 넘긴다.(포인터 변수)
java : 메모리 주소가 아닌 참조값(해시코드)을 할당한다.

참고 1
참고 2

profile
Hello, Android

0개의 댓글