메소드를 호출할 때, 우리는 메소드(함수)로 데이터(인수, 변수)를 전달할 수 있다. 자바에서 메소드로 인수가 전달되는 방법은 기본적으로 값에 의한 호출이다. 값에 의한 호출에서는 인수의 값이 복사되어 매개 변수로 전달된다.
전달하는 인수가 int나 double 같은 기초형 변수인 경우에는 전달하는 인수의 값이 매개변수로 복사된다. 인수의 복사본이 만들어지고, 매개변수를 변경하여도 메소드 외부에 있는 인수에는 영향을 주지 않는다.
int x = 10;
obj.inc(x);
System.out.println(x);
void inc(int a) {
a = a + 1;
}
실행결과: 10
코드 1 inc(x)의 x가 int a로 복사되었지만, 메소드 외부에 있는 인수 int x에는 영향을 주지 않는다.
객체를 메소드로 전달하게 되면 객체 자체가 복사되는 게 아니라, 객체의 참조값만 복사되어서 전달된다. 참조 변수는 참조값(주소)를 가지고 있다. 참조값이 매개 변수로 복사되면 메소드의 매개 변수도 동일한 객체를 참조하게 된다. 따라서 매개 변수를 통하여 객체의 내용을 변경하게 되면 인수가 가리키는 객체도 변경된다.
Pizza obj = new Pizza(10)
obj.inc(obj); // 사이즈업 프로모션 기간
System.out.println(obj.radius;)
void inc(pizza c) {
c.radius++;
}
실행결과 : 11
obj에 저장된 것은 객체가 아니라 객체의 참조값(주소)이다. 두번째 코드 inc(pizza c)를 통해 객체를 변경했기 때문에 원본 객체도 변경됐음. 그래서 변경된 결과(10->11)이 출력되는 것.
배열의 원소들을 출력하는 메소드나 배열 원소들의 평균을 구하는 메소드가 있을 수 있다. 이들 메소드는 모두 배열을 매개 변수로 받아야한다. 만약 배열 원소가 메소드로 전달된다면 이것은 다른 변수들과 다르지 않다. 즉 값이 복사되어서 전달된다.
그러나 배열 전체가 전달된다면 상황은 달라진다. 자바에서는 배열도 객체이기 때문에 배열을 전달하는 것은 배열 참조 변수를 복사하는 것이다.
public class ArrayArgumentTest {
public static double minArray(double[] list) {
double min = list[0];
for (int i = 1; i < list.length; i++) {
if (list[i] < min) {
min = list[i];
}
}
return (min);
}
public static void main(String[] args) {
double[] a = { 1.1, 2.2, 3.3, 4.4, 0.1, 0.2 };
double[] b = { -2.0, 3.0, -9.0, 2.9, 1.5 };
double min;
min = minArray(a);
System.out.println("첫 번째 배열의 최소값=" + min);
min = minArray(b);
System.out.println("두 번째 배열의 최소값=" + min);
}
}
minArray = 배열을 받아서 최소값을 계산하여 반환하는 메소드
그다음 main에서 배열을 받은 것임