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;
}

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

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

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

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.