영어 해석 그대로 Call By Value는 '값에 의한 호출' Call By Reference는 '참조에 의한 호출'이다.
Call by value
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public class CallBy {
public static void main(String[] args) {
int a= 10;
int b = 20;
System.out.println("Before>> a=" + a + " b=" + b);
swap(a, b);
System.out.println("After>> a=" + a + " b=" + b)
}
public static void swap(int one, int two){
int temp = one;
one = two;
two = temp;
}
}
|
cs |
1
2
|
Before>> a=10 b=20
After>> a=10 b=20
|
cs |
값을 가지고 있는 변수가 swap() 메서드에 넘겼으나 값은 바뀌지 않았다.
바뀌지 않은 이유는 인자로 넘어간 a와 b가 그 자체로(주소 값이) 넘어간 것이 아니라 값만 보낸 것이기 때문이다.
예를 들어 a와 b는 '0'과 '1'이라는 주소를 가지고 있다고 가정하면, swap으로 넘어갈 때는 0과 1이 넘어간 것이 아니라 그 값인 10과 20만 넘어간 것이기 때문에 swap의 temp, one two의 값만 바뀌고 a와 b의 값은 바뀌지 않는다.
그렇기 때문에 swap의 temp= 10, one= 20, two = 10의 값을 가질뿐 a, b자체에 변화를 줄 순 없다.
그래서 나는 call by value를 예를 들면,
부모가 무언가를 배우고 와야하는데 부모 자신이 간 것이 아니라 자기 자식을 보낸 것이라고 생각한다.
Call by reference
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
public class CallBy {
int num;
public CallBy(int num) {
this.num = num;
}
public static void main(String[] args) {
CallBy one = new CallBy(10);
CallBy two = new CallBy(20);
System.out.println("Before>> a=" + one.num + " b=" + two.num);
swap(one, two);
System.out.println("After>> a=" + one.num + " b=" + two.num);
}
public static void swap(CallBy one, CallBy two){
int temp = one.num;
one.num = two.num;
two.num = temp;
}
}
|
cs |
1
2
|
Before>> a=10 b=20
After>> a=20 b=10
|
cs |
Call by value를 자식을 보내서 학습이 제대로 되지 않았다고 생각한다면, Call by reference는 부모 자신이 직접 배우러 갔다고 생각한다.
여기서 10과 20은 '0'과 '1'이라는 주소 값을 가지고 있다면, CallBy에 의해 생성된 객체 one, two는 10과 20에 대한 주소 값을 가지고 있다. 그래서 swap() 메서를 호출하면 10, 20이 아닌 one과 two의 주소 값이 전달되고 swap() 메서드 안에서 그 주소 값에 대한 데이터가 바뀌게 되는 것이다.
'JAVA' 카테고리의 다른 글
[JAVA] 하나의 폴더로 이클립스 동작하기 (0) | 2021.12.15 |
---|---|
[JAVA] JavaSE, JavaEE, JavaME (0) | 2021.12.15 |
[JAVA] HashMap (0) | 2021.11.18 |
[JAVA] 문자 대소문자 구분 (0) | 2021.11.08 |
[JAVA] NumberFormatException이란? (0) | 2021.02.04 |