참조 변수 메서드 매개변수로

LeeKyoungChang·2022년 3월 14일
0
post-thumbnail

✔️ 소스


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, rightchange라는 메서드의 매개변수로 주고 나서, 좌우 위치를 변경하였다.
다만, 바꾸고나서 main메서드에서 출력결과 변경되지 않았다고 한다.

 

해결

스크린샷 2022-03-14 오후 1 02 09

이유는 간단하다. 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) : 지역변수의 값을 교체한다.
profile
"야, (오류 만났어?) 너두 (해결) 할 수 있어"

0개의 댓글

관련 채용 정보