매개변수 Parameter
기본형 매개변수
변수의 값을 읽기만 한다.
원본이 아닌 복사본이 변경된 것이라 원본에는 아무런 영향을 미치지 못한다.
public class Test {
public static void main(String[] args) {
Variables v = new Variables();
v.iv = 2;
method(v.iv);
System.out.println("v.iv: " + v.iv); // v.iv: 2
}
public static void method(int iv) {
iv = 10;
}
}
class Variables {
int iv;
}
참조형 매개변수
주소 값을 받기 때문에 변수의 값을 읽고 변경할 수 있다.
public class Test {
public static void main(String[] args) {
Variables v = new Variables();
v.iv = 2;
method(v);
System.out.println("v.iv: " + v.iv); // v.iv: 10
}
public static void method(Variables V) {
V.iv = 10;
}
}
- 간단한 처리는 배열을 이용
암시적으로 간단히 처리할 때는 별도의 클래스를 선언하지 않고 배열을 이용할 수도 있다.
public class Test {
public static void main(String[] args) {
int[] a = {0, 0};
method(a); // method() a[0]: 10
System.out.println("a[0]: " + a[0]); // a[0]: 10
}
public static void method(int[] a) {
a[0] = 10;
System.out.println("method() a[0]: " + a[0]);
}
}
- 활용
반환값이 없어도 메서드의 실행결과를 얻어오거나, 여러 개의 값을 반환 받는 것과 같은 효과를 얻어올 수 있다.
public class Test {
public static void main(String[] args) {
int[] result = {0, 0};
method(1, 2, result);
System.out.println("result[0]: " + result[0] + ", " + "result[1]: " + result[1]);
} // result[0]: 3, result[1]: -1
public static void method(int a, int b, int[] result) {
result[0] = a + b;
result[1] = a - b;
}
}
가변인자 Variable arguments
타입... 변수명
내부적으로 배열을 이용하는 것.
- 같은 타입의 여러 매개변수를 사용할 경우 쓰인다.
void method(int x, int y, int j) {} // before
void method(int... x) {} // after
- 매개변수 중에서 제일 마지막에 선언한다.
void method(int x, long... y) {}
void method(int... x, long y) {} // error
- 인자의 개수를 가변적으로 할 수 있다.
배열과 달리 인자가 아예 없어도 된다.
void method(int... x) {}
method();
method(1);
method(1, 2);
method(new int[2]);
void method(int[] x) {}
method(); // error
method(null);
method(new int[2]);
가변인자를 선언한 메서드를 오버로딩하면 어느 메서드를 호출한 것인지 구별하지 못하는 경우가 발생하기 쉽다.
가능하면 가변인자를 사용한 메서드는 오버로딩 하지 않는 것이 좋다.
참고 서적: 자바의 정석 3판