class A{
public int value;
A(int i){
this.value = i;
}
}
void run( A arg1, A arg2){
arg1.value = 111;
arg2 = arg1;
}
public static void main(String[] args){
A a1= new A(1);
A a2= new A(2);
run(a1,a2);
System.out.println(a1);
System.out.println(a2);
}
______console______
111
2
위의 결과를 보면 분 ㅡ 명 a1은 111로 바뀌었기 때문에 reference로 주었다고 생각할수도 있다.
하지만 정확히 말하면 저건 ref를 준 것이 아니라 a1의 주소를 복사해서 바꾼것이다.
사실 C++ 기준으로 보면 저것도 call-by-reference
의 일종이라 생각된다.
아래는 윤성우의 열혈 C++
에서 발췌한 내용이다.
"본래 C언어에서 말하는
Call-by-Reference
는 다음의 의미를 갖는다.""주소 값을 전달받아서, 함수 외부에 선언된 변수에 접근하는 형태의 함수 호출"
"즉, 주소값이 외부 변수의 참조도구로 사용되는 함수의 호출을 뜻한다. 이렇듯 주소 값이 전달되었다는 사실이 중요한게 아니라, 주소값이 참조의 도구로 사용되었다는 사실이 중요한 것이며, 이것이
Call-by-Value
와Call-by-Reference
를 구분하는 기준이 된다!"
아니 분명 우리 늅늅이 개발자들의 희망 윤성우 선생님께서 주소 값 받아서 함수 외부에 선언된 변수에 접근하면 call-by-reference라는데??
From the authors of Java: "There is exactly one parameter passing mode in Java - pass by value - and that helps keep things simple." The Java Programming Language, 2nd ed. by Ken Arnold and James Gosling, section 2.6.1, page 40, 3rd paragraph.
일단 자바 창시자님이 아니라니까 아닌건가 본데...
reference
를 부른것이 아니라 주소 값이라는 value
복사한 매개변수 호출이라는거고 그래서 call-by-value
라는 것이다...출처: https://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value
위의 유명한 스택오버플로우 답변이있다. 위 말을 정리하면
이해가 안가서 곰곰히 생각해보고 내린 결론은, 분명 객체를 받을 때 우리가 "참조"라고 생각하는 그 객체 다루는 기법? 마저도 value
라는 가치로 전해진다는 것이다.
쉽게 생각해서 그냥 주소값만 복사해서 매개변수에 갖다 줬다고 생각하자 C++에서
Func(SampleClass* a){....}
SampleClass *b = new SampleClass();
Func(b)
이렇게 하면 SampleClass* b
가 가리키는 주소와 a
가 가리키는게 같아지고 요런 느낌으로 전해준다고 생각하면 된다.
하지만 확실히 C++ ref
같은 건 아니다. ref
처럼 아예 참조(별칭)을 붙여서 넘겼다면 위의 코드의 run()
에서 arg2 = arg1
하고나면 A a2
도 111이여야되는데 아니지 않나. 그 이유는 아래서 더 자세히 설명하겠다.
자 코드를 다시 봐보자
여기서 arg2 = arg1 해봤자
이렇게 바뀌고 run이라는 함수에 나와도 a2는 멀뚱멀뚱하게value=2
를 바라본다.
The Java Programming Language, 2nd ed. by Ken Arnold and James Gosling
)