간단한 자바소스.. 이해안되는부분이
글쓴이: jinushun / 작성시간: 수, 2004/04/28 - 8:19오후
class Call { int a, b; void prvAdd(int x, int y) { x = x + 100; y = y + 100; } void objAdd(Call obj) { obj.a = obj.a + 30; obj.b = obj.b + 30; } void objRef(Call obj) { obj = null; } public static void main(String args[]) { Call myCall, yourCall; myCall = new Call(); yourCall = new Call(); myCall.a = 10; myCall.b = 10; System.out.println("원래 a 는 " + myCall.a); System.out.println("원래 b 는 " + myCall.b); myCall.prvAdd(myCall.a, myCall.b); System.out.println("메서드 호출후 a 는 " + myCall.a); System.out.println("메서드 호출후 b 는 " + myCall.b); System.out.println("======================\n"); System.out.println("원래 a 는 " + myCall.a); System.out.println("원래 b 는 " + myCall.b); myCall.objAdd(myCall); System.out.println("메서드 호출후 a 는 " + myCall.a); System.out.println("메서드 호출후 b 는 " + myCall.b); System.out.println("======================\n"); System.out.println("원래 a 는 " + myCall.a); System.out.println("원래 b 는 " + myCall.b); myCall.objRef(myCall); System.out.println("메서드 호출후 a 는 " + myCall.a); System.out.println("메서드 호출후 b 는 " + myCall.b); } }
자바를 사용해야하기에 첨접하는중인데요.. 첫단추부터 헷갈려서
위소스를 돌리면 결과는 아래와 같습니다.
원래 a 는 10 원래 b 는 10 메서드 호출후 a 는 10 메서드 호출후 b 는 10 ====================== 원래 a 는 10 원래 b 는 10 메서드 호출후 a 는 40 메서드 호출후 b 는 40 ====================== 원래 a 는 40 원래 b 는 40 메서드 호출후 a 는 40 메서드 호출후 b 는 40
질문은 왜 마지막 출력부분이 40으로 나오는지요..
레퍼런스가 인자로 넘어가는데 왜 null로 셋팅이되어서 exception 이 안뜨는지 궁금합니다.
조언바랍니다.
Forums:
자바의 함수 호출이 Call by Value냐 Call by Refere
자바의 함수 호출이 Call by Value냐 Call by Reference냐를 두고 많은 논쟁이 있었습니다. 한 번 규모가 있는 자바 커뮤니티들에서 관련 쓰레드를 찾아보시구요.
이 경우에는 메쏘드 호출의 아규먼트로 같은 객체를 가리키는 레퍼런스의 사본(값)이 건네졌다고 이해를 해야 합니다. 그래서 호출한 측(caller)과 호출당한 측(callee)에서 myCall 레퍼런스는 같은 객체를 가리키지만 레퍼런스 자체는 서로 다른 공간에 존재하는 것이 됩니다. 이 점이 메모리를 직접 어드레싱하는 C의 포인터와 다른 점입니다.
이 문장은 레퍼런스 자체를 null로 만드는 무의미한--메쏘드 호출이 끝나면 스택에서 사라질 운명이므로-- 문장입니다.
----
http://nohmad.tumblr.com/
댓글 달기