간단한 자바소스.. 이해안되는부분이

jinushun의 이미지

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 이 안뜨는지 궁금합니다.

조언바랍니다.

nohmad의 이미지

자바의 함수 호출이 Call by Value냐 Call by Reference냐를 두고 많은 논쟁이 있었습니다. 한 번 규모가 있는 자바 커뮤니티들에서 관련 쓰레드를 찾아보시구요.

이 경우에는 메쏘드 호출의 아규먼트로 같은 객체를 가리키는 레퍼런스의 사본(값)이 건네졌다고 이해를 해야 합니다. 그래서 호출한 측(caller)과 호출당한 측(callee)에서 myCall 레퍼런스는 같은 객체를 가리키지만 레퍼런스 자체는 서로 다른 공간에 존재하는 것이 됩니다. 이 점이 메모리를 직접 어드레싱하는 C의 포인터와 다른 점입니다.

void objRef(Call obj)
{
    obj = null;
}

이 문장은 레퍼런스 자체를 null로 만드는 무의미한--메쏘드 호출이 끝나면 스택에서 사라질 운명이므로-- 문장입니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.