[Java] 메서드 호출과 값 전달 1

코드 속의 "진돌"·2024년 1월 9일
0
post-thumbnail

지금부터 자바에서 아주 중요한 대원칙 하나를 이야기하겠다.

📌 자바는 항상 변수의 값을 복사해서 대입한다.

✅ 변수와 값 복사


✏️ MethodValue0

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배 곱하는 메서드이다.

✏️ MethodValue1

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);
  }
}

✏️ 실행 결과

다음 대원칙을 따라간다면 문제를 정확하게 풀 수 있다.

📌 자바는 항상 변수의 값을 복사해서 대입한다.

✏️ 실행 과정 그림

✓ changeNumber(num1) 호출 시점

  • num1의 값 5를 읽고 복사해서 num2에 전달 → 이 부분이 핵심

✓ changeNumber 메서드 실행 중

  • 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에는 영향을 주지 않는다.

profile
매일 성장하는 주니어 개발자의 기록📝

0개의 댓글