코드 그라데이션
<보충> Day13. call by Value와 call by Reference 본문
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 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