- 기본형 매개변수와 참조형 매개변수
자바에서 메서드를 호출할 때 매개변수로 지정한 값을 메서드의 매개변수에 복사하여 넘겨준다.
→ 매개변수 타입이 기본형일 때는 기본형 값이 복사, 참조형이면 인스턴스의 주소가 복사된다.
- ParamEx.java : 매개변수가 기본형일 경우
public class ParamEx {
public static void main(String[] args) {
Data d = new Data();
d.x = 10;
System.out.println("main() : x = " + d.x);
change(d.x); // d.x는 기본형인 int 타입이다.
System.out.println("After change(d.x)");
System.out.println("main() : x = " + d.x);
}
// change의 매개변수는 int 타입의 값만 복사한다.
static void change(int x) {
x = 100;
System.out.println("change() : x = " + x);
}
}
Class Data { int x; }
'd.x'의 값을 chagne 메서드로 변경했으나, 'd.x'의 값은 그대로이다.
→ Data 클래스 내의 d.x가 변경된 것이 아니라, change 메서드의 매개변수 x의 값이 변경된 것이다.
- ParamEx2.java : 매개변수가 참조형일 경우
public class ParamEx2 {
public static void main(String[] args) {
Data d = new Data();
d.x = 10;
System.out.println("main() : x = " + d.x);
change(d); // 매개변수로 참조형 사용
System.out.println("After change(d)");
System.out.println("main() : d.x = " + d.x);
}
// change의 매개변수는 인스턴스의 주소값을 복사한다.
static void change(Data d) {
d.x = 1000;
System.out.println("change() : d.x = " + d.x);
}
}
Class Data { int x; }
ParamEx1과는 달리, change 메서드의 매개변수가 참조형이라 'd.x'의 값이 변경되었다.
→ 값이 아니라 '값이 저장된 주소'를 넘겨주었기에!
- ParamEx3.java : 매개변수가 배열일 경우
public class ParamEx3 {
public static void main(String[] args) {
int[] x = {10}; // 크기가 1인 배열. x[0] = 10;
System.out.println("main() : x = " + x[0]);
change(x); // 매개변수로 배열 사용
System.out.println("After change(x)");
System.out.println("main() : x = " + x[0]);
}
static void change(int[] x) {
x[0] = 1000;
System.out.println("change() : x = " + x[0]);
}
}
배열도 객체와 같이 주소값을 가지고 있기에, 객체처럼 매개변수를 통해 값을 변경할 수 있다.
- 매개변수 응용
참조형 매개변수의 특징을 응용하면 아래와 같이 쓸 수 있다.
// 아래의 두 메서드는 같은 실행결과를 얻어올 수 있다.
int add(int a, int b) {
return a + b; // 기존의 return 방식
}
void add(int a, int b, int[] result) {
result[0] = a + b; // 주소값을 가져오는 참조형 매개변수의 특징 활용
}
참고문헌 : 남궁성(2016), Java의 정석, 도우출판