Java/OOP

[Java] Argument로 참조값을 보내면?

oneH 2024. 11. 16. 11:19

 

**대원칙: 자바는 항상 변수의 값을 복사해서 대입한다.  (김영한 강의 중)

 

저 대원칙을 꼭 기억하고 계속 생각하자.

 

 

 

 

public class MethodChange {
    public static void main(String[] args) {
        DataA dataA = new DataA();
        dataA.value = 10;

        System.out.println("메서드 호출 전 dataA의 값 = "+dataA.value);

        changeValueMethod(dataA);

        System.out.println("메서드 호출 후 dataA의 값 = "+dataA.value);
    }

    static void changeValueMethod(DataA da){
        da.value = 500;
    }
}

class DataA{
    int value;
}

 

 

해당 코드의 출력은 어떻게 될까?

메서드 호출 후 dataA.value=10일까?

 

 

 

 

 

dataA.value 멤버 변수의 값이 메서드 호출 후 변경되었다.

 

코드에 대해 자세히 살펴보자.

 

 

 


 

 

 

자바에서 대입연산 자체가 값을 복사해서 저장한다는 것을 꼭 기억해야 한다. (대원칙)

 

DataA dataA = new DataA();

 

 

인스턴스 생성 과정이다. dataA는 DataA타입의 메모리상 생성된 참조값(객체주소)을 지니고 있다.

 

 

 

 

changeValueMethod(dataA);

static void changeValueMethod(DataA da){
        da.value = 500;
}

 

여기서 void changeValueMethod를 호출한다. 

해당 메서드는 매개변수(파라미터)가 존재한다. 매개변수의 타입은 DataA이다.

 

메서드 호출 할 때 매개변수에 맞게 DataA타입의 참조값을 인자(Argument)로 보낸다.

 

dataA는 참조값을 가지고 있다. 그 값을 매개변수에 대입 연산 시키는 것이다.

 

다시 말해 DataA da = dataA인 것이다. 결국 매개변수와 인자값은 모두 같은 참조값을 가지고 있다.

 

 

같은 객체의 멤버 변수를 수정하는 것이므로 메모리상 어떤 한 객체를 수정한 것이다.

 

코드 외관상 서로 다른 값을 수정하는 것처럼 보이지만 결국에는 같은 객체를 참조하므로 어떤 참조변수로 멤버 변수를 수정해도 동일하다는 것이다.

 

 

 

 

    public static void main(String[] args) {
        DataA dataA = new DataA();
        System.out.println(dataA);
        changeValueMethod(dataA);
    }

    static void changeValueMethod(DataA da){
        System.out.println(da);
    }

 

'

 

결국 같은 참조값(주소값)이다.