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);
}
결국 같은 참조값(주소값)이다.