그럼 일종의 변수할당이라고 할 수 있는 메소드의 매개변수는 어떻게 동작하는가를 살펴보자. 조금 복잡하므로 꼼꼼하게 살펴봐야 한다. 예제를 보자.
package org.opentutorials.javatutorials.reference; public class ReferenceParameterDemo { static void _value(int b){ b = 2; } public static void runValue(){ int a = 1; _value(a); System.out.println("runValue, "+a); } static void _reference1(A b){ b = new A(2); } public static void runReference1(){ A a = new A(1); _reference1(a); System.out.println("runReference1, "+a.id); } static void _reference2(A b){ b.id = 2; } public static void runReference2(){ A a = new A(1); _reference2(a); System.out.println("runReference2, "+a.id); } public static void main(String[] args) { runValue(); // runValue, 1 runReference1(); // runReference1, 1 runReference2(); // runReference2, 2 } }
결과는 아래와 같다.
runValue, 1 runReference1, 1 runReference2, 2
위의 예제는 3가지 경우를 설명하고 있다. 하나씩 살펴보자.
아래 코드는 _value의 매개변수로 기본 데이터형(int)를 전달했다.
runValue();
메소드 _value의 인자로 a를 전달했다. 인자 a는 매개변수 b가 되어서 _value 안으로 전달되고 있다. _value 안에서 b의 값을 변경했다. _value가 실행된 후에 runValue에서 a값을 출력해본 결과 값이 변경되지 않았다. 호출된 메소드의 작업이 호출한 메소드에 영향을 미치지 않고 있다. 어찌보면 자연스러운 결과다.
두번째 코드를 보자. 아래 코드는 _reference1의 매개변수로 참조 데이터 타입을 전달하고 있다.
runReference1();
메소드 _reference1 안에서 매개변수 b의 값을 다른 객체로 변경하고 있다. 이것은 지역변수인 b의 데이터를 교체한 것일 뿐이기 때문에 runReference1의 결과에는 영향을 미치지 않는다.
그런데 다음의 코드는 호출된 메소드의 작업이 호출한 메소드의 변수에 영향을 미친다.
runReference2();
매개변수 b의 값을 다른 객체로 교체한 것이 아니라 매개변수 b의 인스턴스 변수 id 값을 2로 변경하고 있다. 이러한 맥락에서 _reference2의 변수 b는 runReference2의 변수 a와 참조 관계로 연결되어 있는 것이기 때문에 a와 b는 모두 같은 객체를 참조하고 있는 변수다.
매개변수를 다른 객체로 변경하는 것과 참조 데이터 타입의 매개변수에 담겨 있는 객체에 접근하는 것은 완전히 다른 의미를 가지기 때문에 두가지 경우의 차이점을 확실하게 이해하도록 하자.