자바는 항상 변수의 값을 복사해서 대입한다.
이 대원칙은 반드시 이해해야 한다. 그러면 아무리 복잡한 상황에서도 코드를 이해할 수 있다.
변수와 값 복사
int num1 = 5; int num2 = num1; //num2의 값은 num1이다(5) num2 = 10; System.out.println("num1=" + num1); System.out.println("num2=" + num2);
- 여기서 값을 복사해서 대입한다는 부분이 바로 이부분이다.
int num2 = num1;- 이 부분은 생각해보면
num1에 있는 값5를 복사해서num2에 넣는 것이다,
-> 복사한다고 표현한 이유는num1의 값을 읽어도num1에 있는 기존 값이 유지되고, 새로운 값이num2에 들어가기 때문이다. 마치num1의 값이num2에 복사가 된 것 같다.
->num1이라는 변수 자체가num2에 들어가는 것이 아니다.num1에 들어있는 값을 읽고 복사해서num2에 넣는 것이다
-> 간단한게num1에 있는 값을num2에 대입한다고 표현한다. 하지만 실제로는 그 값을 복사해서 대입하는 것이다.
너무 당연한 이야기를 왜 이렇게 장황하게 풀어서 하지? 라고 생각한다면 이제 진짜 문제를 만나보자!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); }실행결과 1. changeNumber 호출 전, num1: 5 2. changeNumber 변경 전, num2: 5 3. changeNumber 변경 후, num2: 10 4. changeNumber 호출 후, num1: 5다음 대원칙을 따라간다면 문제를 정확하게 풀 수 있다.
자바는 항상 변수의 값을 복사해서 대입한다!
메서드 호출과 이름이 같은 변수
- 호출자의 변수 이름과 매개변수의 이름을 같게해서 한번 더 풀어보자
public static void main(String args[]) { int number = 5; System.out.println("1 changeNumber 호출 전, num1: " + number); //출력: 5 changeNumber(number); System.out.println("4 changeNumber 호출 후, num1: " + number); //출력: 5 } public static void changeNumber(int num2) { System.out.println("2 changeNumber 호출 전, num2: " + num2); // 출력: 5 number = number * 2; System.out.println("3 changeNumber 호출 후, num2: " + num2); // 출력: 10 }이번에는
main()에 정의한 변수와 메서드의 파라미터 변수의 이름이 둘다number로 같다.
실행결과1. changeNumber 호출 전, number: 5 2. changeNumber 변경 전, number: 5 3. changeNumber 변경 후, number: 10 4. changeNumber 호출 후, number: 5
main()도 사실은 메서드이다. 각각의 메서드 안에서 사용하는 변수는 서로 완전히 분리된 다른 변수이다. 몰론 이름이 같아도 완전히 다른 변수다. 따라서main()의number와changeNumber()의number은 서로 다른 변수이다.
실행과정changeNumber(number); //changeNumber를 호출한다. main의number(5) changerNumber(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가 출력된다.
메서드 호출과 값 반환받기
- 그렇다면 메서드를 사용해서 값을 변경하려면 어떻게 해야될까?
- 메서드의 호출 결과를 반환받아서 사용하면된다.
public static void main(String args[]) { int num1 = 5; System.out.println("changeNumber 호출 전, num1: " + num1); //출력: 5 num1 = changeNumber(num1); System.out.println("4 changeNumber 호출 후, num1: " + number); //출력: 10 } public static int changeNumber(int num2) { num2 = num2 * 2; return num2; }실행결과
changeNumber 호출 전, num1: 5 changeNumber 호출 후, num1: 10실행과정
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)정리
꼭 기억하자! 자바는 항상 변수의 값을 복사해서 대입한다.