Java pass by reference
조회수 1307회
아래 두 코드의 차이점이 무엇이죠?
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 답변
-
자바는 인수를 항상 참조값이 아닌 값으로서 전달합니다.
예시를 통해 설명드리죠:
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
이제 자바에서 오브젝트를 어떻게 인자로서 전달하는지 이해하셨기를 바랍니다.
댓글 입력