메서드 호출과 값 전달

민범·2023년 12월 25일

Java -기본-

목록 보기
16/18

자바는 항상 변수의 값을 복사해서 대입한다.
이 대원칙은 반드시 이해해야 한다. 그러면 아무리 복잡한 상황에서도 코드를 이해할 수 있다.

변수와 값 복사

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()numberchangeNumber()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)

정리
꼭 기억하자! 자바는 항상 변수의 값을 복사해서 대입한다.

profile
웹 백엔드 개발자를 지향하고 있습니다.

0개의 댓글