class Data {int x;} // Data 객체에 필드 x정의
main(){
Data d = new Data(); // 인스턴스d 생성 (1)
d.x = 10; // d인스턴스 x값 10 설정 (2)
System.out.println(d.x); // 10출력
change(d.x); 값을 바꾸는 함수 입력 (3)
System.out.println(d.x); // 10출력
}
change(int x){
x = 1000; // x값을 1000으로 설정
System.out.println(x); // 1000 출력
}
위 코드를 보면 함수를 선언해 x값을 바꿨는데도 d.x의 값이 그대로 인 이유를 알아보자
- d라는 객체를 만들면 main메모리안에 주소값을 가진다(0x100)
- d.x = 10을 하면 d객체의 메모리에 접근해 그 값을 10으로 변경한다
- change메서드가 실행되어 이 주소값을 변경하는게 아닌 그 값을 복사하여 가져간다
- 그림으로 그리진 않았지만 change()에서 1000으로 변경하면 그 함수내에선 변경되지만 객체의 값 d.x는 변하지 않는다
class Data {int x;} // Data 객체에 필드 x정의
main(){
Data d = new Data(); // 인스턴스d 생성 (1)
d.x = 10; // d인스턴스 x값 10 설정 (2)
System.out.println(d.x); // 10출력
change(d.x); 값을 바꾸는 함수 입력 (3)
System.out.println(d.x); // 1000출력
}
change(Data d){
d.x = 1000;
System.out.println(x); // 1000 출력
}
반대로 위와 같이 코드를 짜면
change()함수를 실행했을 때 객체 주소값을 받아 그 주소값에 접근하기 때문에
객체의 값 d.x가 바뀌어 1000이 출력되는 것을 알 수 있다
복습의 단계로 자바를 다시 하고 있는데 당연히 되겠지 하는 부분을
직접 메모리로 그려보며 어떻게 돌아가는지 세세하게 알 수 있는 시간이 되어
더욱 더 어떻게 동작하는지 알 수 있는 시간이었다
다른 분들도 직접 메모리를 그려보는 습관을 가지길 바란다