코드 그라데이션

<보충> Day13. call by Value와 call by Reference 본문

Java/Mega

<보충> Day13. call by Value와 call by Reference

완벽한 장면 2023. 5. 6. 01:51

call by Value

핵심 : "이 넘어간다"

           변화를 알고 싶으면 return

 

<상황 가정>

int a = 5; 가 있고

xyz(int a) {} 메서드가 있다고 하자.

 

main 메서드에서 xyz(a); 를 호출했을 때,

...

xyz의 매개변수로 값인 5가 넘어간다.

public class Sample {

  static int xyz(int a) {
  	a = 10;
    return a;
  }

  public static void main(String[] args) {
    int a = 5;
    xyz(a);
    
    System.out.println(a); // 5가 출력됨!!!!!
  }

}

 

이 때 바깥에 있는 int a는 변화가 있을까 없을까?

답 : 없다

 

왜? 값만 넘어갔기 때문에

- 매개변수로 넘어간 a를 가공한다고 해도 마찬가지.

- 그냥 매개변수 차원에서 지지고 볶고 하고 끝.

 

값을 줬기 때문에

호출 할 때 불렀던 그 변수에는 아무런 영향이 없다.

 

그럼 만약 10을 출력하고 싶으면 어떻게 해야 할까?

- 리턴값을 받아서 변수에 저장하고, 그 값을 출력하면 됨.

public class ChangeValue {

  static int xyz(int a) {
  	a = 10;
    return a;
  }

  public static void main(String[] args) {
    int a = 5;
    
    a = xyz(a);
    
    System.out.println(a); // 이렇게 하면 10이 출력
  }

}

 

call by Reference

핵심 : 참조.

          "원본에 변화"

 

<상황 가정>

int[ ] b = new int[3] 이라는 배열이 있고

def(int[ ] b) {} 함수가 있다고 하자

main 메서드에서 def(b)를 호출했을 때

....

이건 value가 아니라 reference가 된다!

public class Sample {

  static 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]); // 10이 출력됨
    
  }
}

 

이 때 b에는 변화가 있을까 없을까?

답 : 있다

 

왜? 원본값이기 때문에.

그림으로 살펴보면 다음과 같다.

 

call by Reference


그림으로 두 경우를 모두 정리하면

먼저

call by Value

- 결과를 모르기 때문에, 확인하려면 반드시 return이 필요함.

 


call by Reference

 

- 결과를 확인할 수 있기 때문에 굳이 void여도 상관 없음.

728x90

'Java > Mega' 카테고리의 다른 글

Day32. 네트워크 (2) TCP / UDP  (0) 2023.05.06
Day32. 네트워크 (1) TCP/IP, OSI 7계층  (0) 2023.05.06
Thread 퀴즈  (0) 2023.05.05
<보충> Day25. equals 예제  (0) 2023.05.04
<보충> Day25. 추상화  (0) 2023.05.04
Comments