관리 메뉴

엉망진창

CallByValue 와 CallByReferernce 본문

Study/Java

CallByValue 와 CallByReferernce

엉망진창 2008. 2. 14. 13:23

중요한 예제입니다

이런 곳에서 에러가 나면 찾에내기 힘든 부분입니다.

꼭 기억해두시는 것이 좋겠네요

==================================================================[답변]

1: public class StringBufferTest{
2:    public static void main(String args[]){
3:        StringBuffer a = new StringBuffer("A");
4:        StringBuffer b = new StringBuffer("B");
5:        operate(a,b);
6:        System.out.println(a+ "," + b);
7:     }
8:
9:    static void operate(StringBuffer x, StringBuffer y){
10:        x.append(y);
11:        y = x;
12:    }
13:}

-----------------------------------------------------------------------

CallByValue 와 CallByReferernce라는 것을 설명하기 위해서 사용하는 예제군요

이 두가지 호출방법은 아주 중요합니다
CallByValue는 data의 값(value)을 넘겨주고
CallByReferernce는 data의 주소(referernce)를 넘겨준다는 것을 기억하세요.

예제는 주소값이 넘어간다는 것을 확인하려는 것이지요
StringBuffer 객체 a, b, x, y 이렇게 네개가 있네요

3라인 에서 a 를 생성하네요
여기서 주의 깊게 생각할 것이 있는데요
메모리의 "xxx" 공간에 "A"를 저장하고 a 에는 "xxx" 를 넣어뒀다(참조하다)는 것이죠
그렇다면 4라인도 같은 식으로 실행되겟죠?
메모리의 "yyy" 공간에 "B"를 저장하고 b 에는 "yyy" 를 넣어둔다(참조하다).

a --------------------> xxx:A
b --------------------> yyy:B

이렇게 a는 xxx 주소를 가리키고(참조하고) 있고
b는 yyy 주소를 가리키고(참조하고) 있다는 말이지요

5라인에서 메서드를 호출하는 군요
여기서 넘겨지는 a와 b는 주소 즉 "xxx" 와 "yyy"를 넘겨주게 되죠

9라인을 보면 x 와 y 를 매게변수로 받습니다
x 에는 a 가 대칭되고, y 에는 b 가 대칭됩니다
x 에는 "A" 가 아닌 "A"를 담고있는 공간의 주소 "xxx"가 들어가고요
y 에는 "B" 가 아닌 "B"를 담고있는 공간의 주소 "yyy"가 들어가는 것이죠

결국 a와 x는 같은 곳을 가리키고 있겠고요
b와 y는 같은 곳을 가리키고 있겠네요

a ---------------> xxx:A <---------------- x
b ---------------> yyy:B <---------------- y

10라인을 보면 x에다가 y를 붙이죠. 정확히 말하자면
'x가 참조(가리키는)하는 주소의 값에 y가 참조하는 주소의 값을 붙여라' 라고
할 수 있겠네요. 그럼 xxx 공간에는 AB 라고 값이 들어가게 되겠네요

a ---------------> xxx:AB <---------------- x
b ---------------> yyy:B   <---------------- y

11라인에서 y 에 x 를 대입합니다
여기서는 x 의 주소를 y 에 대입하여 y 도 "xxx"를 참조하게되는 것이죠

a ---------------> xxx:AB <---------------- x, y
b ---------------> yyy:B

6라인에서 a 값과 b 값을 출력하네요
결과는 "AB, B" 이렇게 나오겠죠?

11라인 다음에 x 와 y 값을 출력해보면 "AB,AB"가 나와야 하겠지요
왜냐하면 둘다 모두 xxx:AB를 참조하고 있으니까요

 

네이버 지식인 중 korea_zeus 님의 답변입니다.