기본형, 참조형 parameter
참조형 예시1
class Data { int x; } class ReferenceParamEx { public static void main(String[] args) { Data d = new Data(); d.x = 10; System.out.println(d.x); // prints 10 change(d); // pass d System.out.println(d.x); // After change, prints 1000 } static void change(Data d) { d.x = 1000; } }
change메서드의 매개변수가 참조형이라서 값이 아니라 값이
d
가 저장된 주소를 change메서드에게 넘겨주기 때문에, 메서드를 호출한 뒤d.x
값이 변경된다.참조형 예시2
class ReferenceParamEx2 { public static void main(String[] args) { int[] x = {10}; // 길이가 1인 배열 선언 및 초기화 System.out.println(x[0]); // prints 10 change(x); // pass x(array) System.out.println(x[0]); // After change, prints 1000 } static void change(int[] x) { x[0] = 1000; } }
참조형 예시3
class ReturnTest { public static void main(String[] args) { ReturnTest r = new ReturnTest(); int result = r.add(3,5); System.out.println(result); // prints 8 int[] result2 = {0}; // 배열 생성 및 0으로 초기화 r.add(3,4,result2); System.out.println(result2[0]); int add(int a, int b) { return a + b; } void add(int a, int b, int[] result) { // 반환값이 없는 메서드 result[0] = a + b; } } }
반환값이 없는 add메서드를 응용하면, 원래 하나의 값만 리턴할 수 있는 메서드를 여러 개 값을 반환받는 효과를 낼 수 있다.
기본형
class Data { int x; } class ReferenceParamEx { public static void main(String[] args) { Data d = new Data(); d.x = 10; System.out.println(d.x); // prints 10 change(d.x); System.out.println(d.x); // After change, prints 10 } static void change(int x) { x = 1000; } }
change메서드가 호출되면서
d.x
가 change메서드의 매개변수x
에 복사된다. 그 복사된 값이 1000으로 변경된 것이기 때문에 원본d.x
는 변경되지 않는다.
+) Javascript 메뉴의 pass by reference 글 참조
참조형 return
예시
class Data { int x; } class ReferenceParamEx { public static void main(String[] args) { Data d = new Data(); d.x = 10; System.out.println(d.x); // prints 10 Data d2 = copy(d); // 반환한 tmp값을 참조변수 d2에 저장 System.out.println(d2.x); // prints 10 } static Data copy(Data d) { // 반환 타입이 Data. 객체 주소를 반환한다. Data tmp = new Data(); tmp.x = d.x; // 값을 복사 return tmp; } }
copy메서드의 반환타입이 Data이므로, 호출 결과를 받아서 저장하는 변수타입도 Data여야 한다(
d2
).copy메서드 내에 생성한 객체를 메인메서드에서 사용하려면 새로운 객체의 주소를 반환해줘야 한다. 그렇지 않으면 copy메서드가 종료되면 새로운 객체의 참조가 사라져 더 이상 사용할 수 없기 때문이다.