✔️ 소스
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)
: 지역변수의 값을 교체한다.