함수 호출 방법에는 크게 두 가지가 있다.
- Call By Value (값에 의한 호출)
- Primitive Type 기본 자료형 (int, short, long, float, double, char, boolean) 일 경우 - Call By Reference (참조에 의한 호출)
- Reference Type 참조 자료형 (Array, Class Instance) 일 경우
Call By Value (값에 의한 호출)는 인자로 받은 값을 복사하여 처리를 한다.
Call By Reference (참조에 의한 호출)는 인자로 받은 값의 주소를 참조하여 직접 값에 영향을 준다. (주소 값을 넘긴다.)
다시 말해 값을 복사하여 처리하느냐, 직접 참조를 하느냐의 차이.
Programming 구조상 Call By Value를 하면 값을 복사하여 넘기기 때문에 메모리 사용량이 늘어난다. (요즘에는 기기의 성능이 좋아져 상관이 없지만 많은 계산이 들어가면 과부하의 원인이 될 수도 있다.) 하지만 복사처리가 되기 때문에 원래의 값은 영향을 받지 않아 안전하다.
Call By Value
예시를 통해 확인해보면
void main() {
int a = 30;
System.out.println(a); // 30
method(a);
System.out.println(a); // 30
}
void method(int a) {
a++;
}
main 함수에서 method 함수로 int 변수를 전달한다고 했을때, 넘겨받은 method 함수에서 어떤 작업을 수행하던지 변수에는 변함이 없다.
main 함수에서 a 변수에 30이 담겨 있다. a 변수를 method 함수로 넘겨주고 method 함수는 이 값을 +1을 해준다.
method 함수를 호출하기 전과 후의 a 출력 값은 어떤 변화가 있을까?
여전히 a 변수의 값은 30이다.
Call By Reference
void main() {
Data data = new Data();
data.a = 30;
System.out.println(data.a); // 30
method(a);
System.out.println(data.a); // 60
}
void method(Data data) {
data.a = data.a * 2;
}
class Data {
int a;
}
Java에서 Call By Reference는 해당 객체의 주소 값을 직접 넘기는 게 아닌 객체를 보는 또 다른 주소 값을 만들어서 넘긴다는 것을 기억하자.
int a 와 Data를 전달할 때에는 어떤 차이가 있었던 것일까?
Java에서는 Call by Value 방식을 수행할 때, 값을 넘겨받은 메소드에서 값을 복사하여 새로운 지역 변수에 저장한다. 이 때 method()는 main()의 변수를 사용한 것이 아니라, 자신이 새롭게 생성한 지역 변수에 method()의 변수 이름과 변수 값을 복사하여 사용하는 것이다.
때문에 아무리 method()에서 int a값을 바꾸어도 main()의 int a에게는 영향을 끼칠 수 없다. 변수명만 같을 뿐 다른 주소를 가지는 별개의 친구들이기 때문이다.
하지만 만약 Java가 Call by Reference 방식을 사용한다면 영향을 끼칠 수 있다. 다른 변수가 아니라 같은 주소를 공유하는 변수이기 때문.
'Reference Type'인 이유가 Heap Memory 영역에 생성된 객체의 주소값을 참조하기 때문이다. 따라서 main()에서 method()로 넘겨준건 Data의 주소값이고, main()이 가지고 있는 주소값과 동일한 주소값을 가지고 이 객체의 상태를 수정하면 당연히 두 Data는 동일한 주소를 참조하기 때문에 위의 예제와 같은 결과가 나온다.
Reference
'Algorithm & Data Structure > study' 카테고리의 다른 글
[Data Structure / Java] ✒️ Stack, Queue (0) | 2022.08.15 |
---|---|
[Data Structure / Java] ✒️ Map (2) | 2022.08.12 |
[Data Structure / Java] ✒️ ArrayList와 LinkedList의 차이 (0) | 2022.08.08 |
[Data Structure / Java] ✒️ 시간 복잡도 (0) | 2022.08.04 |
[Data Structure / Java] ✒️ 컴퓨터가 데이터를 다루는 방법 (0) | 2022.08.03 |