지금부터 자바에서 아주 중요한 대원칙 하나를 이야기하겠다.
📌 자바는 항상 변수의 값을 복사해서 대입한다.
package method;
public class MethodValue0 {
public static void main(String[] args) {
int num1 = 5;
int num2 = num1;
num2 = 10;
System.out.println("num1 = " + num1);
System.out.println("num2 = " + num2);
}
}
int num2 = num1; // num1의 값은 5이다. num1(5)
int num2 = 5; // num2 변수에 대입하기 전에 num1의 값 5를 읽는다. 결과 : num1(5), num2(5)
num2 = 10; // num2에 10을 대입한다. 결과 : num1(5), num2(10)
여기서 값을 복사해서 대입한다는 부분이 바로 이 부분이다.
int num2 = num1;
num1
에 있는 값 5
를 복사해서 num2
에 넣는 것이다.num1
의 값을 읽어도 num1
에 있는 기존 값이 유지되고, 새로운 값이 num2
에 들어가기 때문이다. 마치 num1
의 값이 num2
에 복사가 된 것 같다.num1
이라는 변수 자체가 num2
에 들어가는 것이 아니다. num1
에 들어있는 값을 읽고 복사해서 num2
에 넣는 것이다.num1
에 있는 값을 num2
에 대입한다고 표현한다. 하지만 실제로는 그 값을 복사해서 대입하는 것이다.다음은 숫자를 2배 곱하는 메서드이다.
package method;
public class MethodValue1 {
public static void main(String[] args) {
int num1 = 5;
System.out.println("1. changeNumber 호출 전, num1 : " + num1);
changeNumber(num1);
System.out.println("4. changeNumber 호출 후, num1 : " + num1);
}
public static void changeNumber(int num2) {
System.out.println("2. changeNumber 변경 전, num2 : " + num2);
num2 = num2 * 2;
System.out.println("3. changeNumber 변경 후, num2 : " + num2);
}
}
다음 대원칙을 따라간다면 문제를 정확하게 풀 수 있다.
📌 자바는 항상 변수의 값을 복사해서 대입한다.
num1
의 값 5
를 읽고 복사해서 num2
에 전달 → 이 부분이 핵심num2
의 변경은 num1
에 영향을 주지 않는다. 왜냐하면 앞서 값을 복사해서 전달했기 때문이다.changeNumber(num1); // changeNumber를 호출한다. num1(5)
changeNumber(5); // num1의 값을 읽는다.
void changeNumber(int num2 = 5) // num1의 값 5가 num2에 복사된다. 결과 : num1(5), num2(5)
num2 = num2 * 2; // num2에 2를 곱한다. 결과 : num1(5), num2(5)
num2 = 5 * 2; // num2의 값을 읽어서 2를 곱한다. 결과 : num1(5), num2(5)
num2 = 10; // num2에 계산 결과인 값 10을 대입한다. 결과 : num1(5), num2(10)
num2를 출력한다 : num2의 값인 10이 출력된다.
num1을 출력한다 : num1의 값인 5가 출력된다.
결과적으로 매개변수 num2
의 값만 10
으로 변경되고 num1
의 값은 변경되지 않고 기존 값인 5
로 유지된다. 자바는 항상 값을 복사해서 전달하기 때문에 num2
의 값을 바꾸더라도 num1
에는 영향을 주지 않는다.