면접에서 아이스 브레이킹 차원으로 자주 나오는 문제였습니다.
면접 질문: Call by Value와 Call by Reference의 정의와 함께 장단점을 설명해주세요.
C, C++에서 함수는 두 가지 방법으로 호출될 수 있습니다.
1. Call by Value
2. Call by Reference
그리고 함수에 전달되는 매개변수를 실제 매개변수라고 부르고 함수가 전달받은 매개변수를 형식 매개변수라고 부릅니다.
Call by Value
- 이 매개변수 전달 방법에서, 실제 매개변수의 값은 형식 매개변수에 복사되고 두 유형의 매개변수는 서로 다른 메모리에 저장됩니다.
- 따라서 함수 내에서의 변경은 실제로 전달된 실제 매개변수에 반영되지 않습니다.
장점
- 복사하여 처리하기 때문에 매개변수로 전달된 값이 보존이 되고 안전합니다.
단점
- 복사를 하기 때문에 메모리 사용량이 늘어납니다.
C/C++ 예시
#include <stdio.h> void swap(int x, int y); int main() { int a = 10, b = 20; swapx(a, b); printf("a=%d b=%d\n", a, b); return 0; } void swap(int x, int y) { int temp; temp = x; x = y; y = temp; printf("x=%d y=%d\n", x, y); }
출력값
x=20 y=10 a=10 b=20
Call by Reference
- 실제 매개변수와 형식 매개변수 모두 동일한 메모리를 참조하므로 함수 내에서 변경한 내용이 실제로 전달된 실제 매개변수에 반영됩니다.
장점
- 복사하지 않고 직접 참조를 하기 때문에 실행속도가 빠릅니다.
단점
- 장점이자 단점인데 직접 참조를 하기 때문에 원래의 값이 영향을 받습니다.
C언어 예시
#include <stdio.h> void swap(int*, int*); int main() { int a = 10, b = 20; swapx(&a, &b); printf("a=%d b=%d\n", a, b); return 0; } void swap(int* x, int* y) { int temp; temp = *x; *x = *y; *y = temp; printf("x=%d y=%d\n", *x, *y); }
출력값
x=20 y=10 a=20 b=10
C++ 예시
#include <iostream> using namespace std; void swap(int &, int &); int main() { int a = 10, b = 20; swapx(&a, &b); printf("a=%d b=%d\n", a, b); return 0; } void swap(int &x, int &y) { int temp = x; x = y; y = temp; printf("x=%d y=%d\n", x, y); }
출력값
x=20 y=10 a=20 b=10
표로 정리하자면 아래와 같습니다.
Call by Value | Call by Reference |
함수를 호출할 때, 변수의 값을 전달합니다. | 함수를 호출할 때, 변수의 값을 전달하는 대신, 변수의 메모리 주소를 전달합니다. |
함수로 전달된 매개변수 값이 함수의 dummy 변수에 복사됩니다. | 함수로 전달된 매개변수의 주소가 함수의 dummy 변수에 복사됩니다. |
함수 내 dummy 변수에 대한 변경은 함수로 전달된 매개변수의 값에 영향을 미치지 않습니다. | 주소를 사용하면 함수로 전달된 매개변수에 접근할 수 있고 따라서 함수 내 변경이 반영됩니다. |
* Java 의 경우 항상 call by value 입니다. 자바는 객체를 메서드로 넘길 때 참조하는 지역변수의 실제 주소를 넘기는 것이 아니라 그 지역변수가 가리키고 있는 힙 영역의 객체를 가리키는 새로운 지역변수를 생성하여 그것을 통하여 같은 객체를 가리키도록 하는 방식입니다.
call by value는 메모리의 저장값, call by reference 는 메모리의 주소값을 보내는데 java 의 경우 인자값을 받아서 해당값을 변경하더라도 호출했던 class 내에서의 객체가 변경되지는 않습니다.
* Python의 경우 mutable, immutable 객체에 대해 모두 Call by Assignment 형식입니다.
[출처]
https://www.geeksforgeeks.org/difference-between-call-by-value-and-call-by-reference/
https://www.geeksforgeeks.org/g-fact-31-java-is-strictly-pass-by-value/
'면접 준비' 카테고리의 다른 글
[Java] 정렬 (0) | 2021.04.25 |
---|---|
ios_base::sync_with_stdio(false); cin.tie(null); 구문을 추가해주는 이유 (11) | 2020.11.03 |
데이터베이스) DBMS 키 정리 (0) | 2020.06.10 |
데이터베이스 쿼리 실행 순서 (2) | 2020.06.07 |
삽입 정렬(Insertion Sort) 구현 (0) | 2019.10.06 |