같은 문제를 호출자의 변수 이름과 매개변수의 이름을 같게 해서 한번 더 풀어보자.
package method;
public class MethodValue2 {
public static void main(String[] args) {
int number = 5;
System.out.println("1. changeNumber 호출 전, number : " + number); // 출력 : 5
changeNumber(number);
System.out.println("4. changeNumber 호출 후, number : " + number); // 출력 : 5
}
public static void changeNumber(int number) {
System.out.println("2. changeNumber 변경 전, number : " + number); // 출력 : 5
number = number * 2;
System.out.println("3. changeNumber 변경 후, number : " + number); // 출력 : 10
}
}
이번에는 main()
에 정의한 변수와 메서드의 매개변수(파라미터)의 이름이 둘 다 number
로 같다.
main()
도 사실은 메서드이다. 각각의 메서드 안에서 사용하는 변수는 서로 완전히 분리된 다른 변수이다. 물론 이름이 같아도 완전히 다른 변수다. 따라서 main()
의 number
와 changeNumber()
의 number
는 서로 다른 변수이다.
changeNumber(number); // changeNumber를 호출한다. main()의 number(5)
changeNumber(5); // number의 값을 읽는다.
// main()의 number값 5가 changeNumber()의 number에 복사된다.
// 결과 : main()의 number(5), changeNumber()의 number(5)
void changeNumber(int number = 5)
// changeNumber()의 number에 값 10을 대입한다.
// 결과 : main()의 number(5), changeNumber()의 number(10)
number = number * 2;
main()의 number를 출력한다 : main()의 number의 값인 5가 출력된다.
그렇다면 메서드를 사용해서 값을 변경하려면 어떻게 해야할까?
메서드의 호출 결과를 반환 받아서 사용하면 된다.
package method;
public class MethodValue3 {
public static void main(String[] args) {
int num1 = 5;
System.out.println("changeNumber 호출 전, num1 : " + num1); // 출력 : 5
num1 = changeNumber(num1);
System.out.println("changeNumber 호출 후, num1 : " + num1); // 출력 : 10
}
public static int changeNumber(int num2) {
num2 = num2 * 2;
return num2;
}
}
num1 = changeNumber(num1); // num1(5)
num1 = changeNumber(5);
// 호출 시작 : changeNumber()
// num1의 값 5가 num2에 대입된다. num1의 값을 num2에 복사한다. num1(5), num2(5)
int changeNumber(int num2 = 5)
num2 = num2 * 2; // 계산 결과 : num1(5), num2(10)
return num2; // num2의 값은 10이다.
return 10;
// 호출 끝 : changeNumber()
num1 = changeNumber(5); // 반환 결과가 10이다.
num1 = 10; // 결과 : num1(10)
🔔 정리
자바는 항상 변수의 값을 복사해서 대입한다.
(참고로 참조형이라는 것이 있는데, 이때도 똑같다. 결국 참조형 변수에 있는 값인 참조값을 복사하는 것이다.)