
✔️ 소스
class A{
A l;
A r;
int data;
A(){
}
A(int data){
this.data = data;
}
public void insert(A left){
this.l = left;
}
public void insert(A left, A right){
this.l = left;
this.r = right;
}
}
// tip: each public class is put in its own file
public class main
{
public static void change(A l, A r){
System.out.println("현재 left, right" + l + ", " + r );
A tmp = l;
l = r;
r = tmp;
System.out.println("바뀐 left, right" + l + ", " + r );
}
public static void change(A a){
A tmp = a.l;
a.l = a.r;
a.r = tmp;
}
// tip: arguments are passed via the field below this editor
public static void main(String[] args)
{
A a = new A(2);
A b = new A(4);
A c = new A(5);
A d = new A(6);
b.insert(d);
a.insert(b, c);
System.out.println("현재 left, right" + a.l + ", " + a.r );
change(a.l, a.r);
System.out.println("바뀐 left, right" + a.l + ", " + a.r );
}
}
✔️ 결과
main 현재 left, rightA@5b2133b1, A@72ea2f77
chang 현재 left, rightA@5b2133b1, A@72ea2f77
chang 바뀐 left, rightA@72ea2f77, A@5b2133b1
main 바뀐 left, rightA@5b2133b1, A@72ea2f77
A의 자식 left, right를 change라는 메서드의 매개변수로 주고 나서, 좌우 위치를 변경하였다.
다만, 바꾸고나서 main메서드에서 출력결과 변경되지 않았다고 한다.
이유는 간단하다. a라는 레퍼런스 변수 자체를 heap영역에 넘길시 변경은 된다.
다만, a라는 레퍼런스 자식 b, c를 매개변수로 넘겨주면 stack 영역에 있는 값을 교체하게 된다.
그러면? main에 있는 a 인스턴스가 가리키고 있는 heap영역의 값이 아닌 단지 매개변수로 넘긴 (a와 관계없이) b, c가 가리키고 있는 heap 영역의 데이터를 교환하게 된다.
그래서 main으로 다시 돌아와서 인스턴스 a를 출력해보면 이전과 같은 것이다.
📌 정리
위에 있는 소스보고 정리
A l,A r,A tmp: 참조 변수, 지역 변수이며 스택 영역이다.main에서 A a, b, c, d : 지역변수, 스택 영역이다.new A(2), new A(4), new A(5), new A(6)으로 만들어진 인스턴스만 힙영역이다.change(A a): 인스턴스에 있는 값을 교체한다.change(A l, A r): 지역변수의 값을 교체한다.