JAVA

Call By Value / Call By Reference

superbono 2021. 8. 14. 15:52

https://www.guru99.com/call-by-value-vs-call-by-reference.html

 

* Call By Value

인수의 을 해당 함수의 형식 매개변수에 복사한다. 따라서 해당 함수가 내부에서 매개변수를 이용하여 값을 바꾸더라도 인수에 영향을 미치지 않는다. 매개 변수는 다른 메모리의 주소를 가진다. 

 

Call By Value의 예

public class Tester{
   public static void main(String[] args){
      int a = 30;
      int b = 45;
      System.out.println("Before swapping, a = " + a + " and b = " + b);
      // Invoke the swap method
      swapFunction(a, b);
      System.out.println("\n**Now, Before and After swapping values will be same here**:");
      System.out.println("After swapping, a = " + a + " and b is " + b);
   }
   public static void swapFunction(int a, int b) {
      System.out.println("Before swapping(Inside), a = " + a + " b = " + b);
      // Swap n1 with n2
      int c = a;
      a = b;
      b = c;
      System.out.println("After swapping(Inside), a = " + a + " b = " + b);
   }
}

 

결과 

Before swapping, a = 30 and b = 45
Before swapping(Inside), a = 30 b = 45
After swapping(Inside), a = 45 b = 30
**Now, Before and After swapping values will be same here**:
After swapping, a = 30 and b is 45

SwapFunction에서 a와 b의 값을 바꾸어주었지만 call by value 형식은 매개변수로 넘어오는 값을 다른 메모리 주소를 가진 변수에 저장하기 때문에 본래의 변수 값에 영향을 주지 않는다.

 

* Call By Reference

인수의 주소를 해당 함수의 형식 매개변수에 복사한다. 이 메서드에서 주소는 함수 호출에 사용된 실제 인수에 액세스하는데 사용된다. 따라서 매개변수가 변경되면, 전달된 인수도 변경된다. 메모리 할당은 실제 매개변수와 동일하다. 함수 내의 모든 연산은 실제 파라미터의 주소에 저장된 값으로 수행되며 수정된 값은 같은 주소에 저장된다.

 

Call By Reference의 예 

public class JavaTester {
   public static void main(String[] args) {
      IntWrapper a = new IntWrapper(30);
      IntWrapper b = new IntWrapper(45);
      System.out.println("Before swapping, a = " + a.a + " and b = " + b.a);
      // Invoke the swap method
      swapFunction(a, b);
      System.out.println("\n**Now, Before and After swapping values will be different here**:");
      System.out.println("After swapping, a = " + a.a + " and b is " + b.a);
   }
   public static void swapFunction(IntWrapper a, IntWrapper b) {
      System.out.println("Before swapping(Inside), a = " + a.a + " b = " + b.a);
      // Swap n1 with n2
      IntWrapper c = new IntWrapper(a.a);
      a.a = b.a;
      b.a = c.a;
      System.out.println("After swapping(Inside), a = " + a.a + " b = " + b.a);
   }
}
class IntWrapper {
   public int a;
   public IntWrapper(int a){ this.a = a;}
}

 

결과 

Before swapping, a = 30 and b = 45
Before swapping(Inside), a = 30 b = 45
After swapping(Inside), a = 45 b = 30
**Now, Before and After swapping values will be different here**:
After swapping, a = 45 and b is 30

매개변수로 전달된 객체들은 주소가 넘어오기 떄문에 swapFunction 메소드에서 값을 바꾸어주게 되면 객체들의 값도 바뀌게 된다. 

 

* Call By Value와 Call By Reference 비교 정리

매개변수 call by value call by reference
정의 함수를 호출하는 동안 변수를 복사하여 값을 전달하는 것 함수를 호출하는 동안 변수의 주소를 넘겨주는 것
인수 변수의 복사본이 전달된다.  변수의 주소를 넘겨주는 거니까 궁극적으론 변수 자체가 전달되는 것
효과 함수 내부에서 변수 복사본의 값이 변경되더라도 함수 외부의 변수 값이 변경되진 않는다.  함수 내부에서의 변수의 변경은 함수 외부의 변수 값에도 영향을 준다.  
변수 값 변화 실제 변수를 변경할 순 없다.  함수 호출을 사용하여 변수 값을 변경할 수 있다.
변수를 전달하는 방식 변수 값은 간단한 방법을 사용하여 전달된다.  포인터 변수는 변수의 주소를 저장하는데 필요하다. 
메모리 위치 실제 및 형식 인수는 다른 메모리 위치에 생성된다.  실제 및 형식 인수는 동일한 메모리 위치에 생성된다.
안전성 실제 인수는 수정할 수 없기 떄문에 안전하게 원래 값을 유지할 수 있다. 실수로 수정할 수 있으므로 인수 작업을 신중하게 처리해야 한다. 
기본 C++, PHP와 같은 많은 프로그래밍 언어의 기본 값이다.  JAVA와 같은 대부분의 프로그래밍 언어에서 지원되지만 기본 값은 아니다. 

출처 - https://www.guru99.com/call-by-value-vs-call-by-reference.html

'JAVA' 카테고리의 다른 글

Exception (예외)  (0) 2022.02.13
IntelliJ 단축키 설정  (0) 2021.11.30
객체 복제  (0) 2021.08.11
추상 클래스 (Abstract class)  (0) 2021.07.29
Static  (0) 2021.07.21