Java pass by reference


아래 두 코드의 차이점이 무엇이죠?

Code A:

Foo myFoo;
myFoo = createFoo();

createFoo 메소드

public Foo createFoo()
{
   Foo foo = new Foo();
   return foo;
}

Code B:

Foo myFoo;
createFoo(myFoo);

public void createFoo(Foo foo)
{
   Foo f = new Foo();
   foo = f;
}

두 코드에 차이점이 있을까요? 감사합니다!

  • 2016년 07월 10일에 작성됨

조회수 74


1 답변


좋아요
0
싫어요
채택취소하기

자바는 인수를 항상 참조값이 아닌 값으로서 전달합니다.


예시를 통해 설명드리죠:

public class Main
{
     public static void main(String[] args)
     {
          Foo f = new Foo("f");
          changeReference(f); // 참조값이 실제로 바뀌진 않을겁니다
          modifyReference(f); // 변수 “f”가 가리키는 오브젝트의 참조값이 변할겁니다
     }
     public static void changeReference(Foo a)
     {
          Foo b = new Foo("b");
          a = b;
     }
     public static void modifyReference(Foo c)
     {
          c.setAttribute("c");
     }
}

단계별로 설명드리죠:

1. Foo타입의 변수 f를 선언하고 속성값으로 “f”를 갖는 Foo타입의 오브젝트를 할당.

Foo f = new Foo("f");

http://i.stack.imgur.com/arXpP.png

2. 메소드 입장에서, Foo타입의 a라는 reference가 선언되었고 null로 초기화 되었습니다.

public static void changeReference(Foo a)

http://i.stack.imgur.com/k2LBD.png

3. changeReference 메소드를 호출함에 따라, reference a에 인자로서 전달된 오브젝트가 할당될 것입니다.

changeReference(f);

http://i.stack.imgur.com/1Ez74.png

4. Foo타입의 b라는 reference를 선언하고 속성값으로 “b”를 갖는 Foo타입의 오브젝트를 할당

Foo b = new Foo("b");

http://i.stack.imgur.com/Krx4N.png

5. a=b 표현식은 f가 아니라 reference a가 속성값이 “b”인 오브젝트를 가리키게 하는 것과 같습니다.

http://i.stack.imgur.com/rCluu.png


6. modifyReference(Foo c)메소드를 호출함에 따라, reference c가 생성되고 속성값 “f”를 갖는 오브젝트가 할당됩니다.

http://i.stack.imgur.com/PRZPg.png

7. c.setAttribute(“c”); 메소드는 reference c가 가리키는 오브젝트의 속성값을 바꿀 것이고, 그 오브젝트는 f가 가리키는 오브젝트일 것입니다.

http://i.stack.imgur.com/H9Qsf.png

이제 자바에서 오브젝트를 어떻게 인자로서 전달하는지 이해하셨기를 바랍니다.

  • 2016년 07월 11일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close