코드 그라데이션

Day13. Call by Value와 Call by Reference 본문

Java/Mega

Day13. Call by Value와 Call by Reference

완벽한 장면 2023. 3. 31. 09:17

1. Call by Value

  • 값에 의한 호출이라고도 하며, 함수 호출 시 인자로 값을 전달한다.
  • 함수 내부에서 인자 값이 변경되어도 호출한 쪽에는 영향을 주지 않는다..
  • 호출한 쪽에서 전달한 값의 복사본이 함수 내부에서 사용되기 때문이다.

 

2. Call by Reference

  • 참조에 의한 호출이라고도 하며, 함수 호출 시 인자로 변수의 주소를 전달한다.
  • 함수 내부에서 인자 값이 변경되면 호출한 쪽에서도 그 변경된 값이 반영된다.
  • 호출한 쪽에서 전달한 변수의 주소가 함수 내부에서 사용되기 때문이다.

 

 

Call by Value 예시코드

Void abc(int a){
     a = 10;
}


public static void main(String[] args) {
    int a = 5;
    abc(a);
    System.out.println(a);
}

1) 첫번째 예제에서 abc 메소드는 int 변수 a 인자로 받습니다.

 

2) abc 메소드 내에서 a 값을 변경하였지만, 이 변경된 값은 메소드 외부의 main 메소드에 영향을 주지 않습니다.

   이유는 abc 메소드에 int 변수 a 값으로 전달되었기 때문입니다. 이것이 Call by Value 방식입니다.

 

3) 그래서 main 메소드에서 a 초기값을 5로 설정하고,

    abc 메소드에 인자로 전달하였지만,

    abc 메소드에서 a 10으로 변경하였더라도 main 메소드에서 출력하는 a 값은 여전히 5입니다.

 

 

---------------------

 

Call by Reference 예시코드

Void def(int[] b)
{
      b[0] = 10;
}



public static void main(String[] args){
   int[] b = new int[3];
   def(b);
   System.out.println(b[0]);
}

 

1) 두번째 예제에서 def 메소드는 int형 배열 b를 인자로 받습니다. def 메소드 내에서 b[0] 값을 변경하였습니다.

 

2) 이 변경된 값은 메소드 외부의 main 메소드에 영향을 줍니다.

    이유는 def 메소드에 int형 배열 b가 참조값으로 전달되었기 때문입니다. 이것이 Call by Reference 방식입니다.

 

3) 그래서 main 메소드에서 int형 배열 b를 선언하고, def 메소드에 인자로 전달하였지만,

   def 메소드에서 b[0]를 10으로 변경하였기 때문

   main 메소드에서 출력하는 b[0]의 값은 10이 됩니다.

 

4) 이렇게 객체나 배열의 참조값을 인자로 전달할 때에는 Call by Reference 방식으로 동작하게 됩니다.

728x90
Comments