Call by Value & Call by Reference
@sberryyogurt
Call by Value & Call by Reference의 차이점
B
Main
A B A
Value
5 7
변수 이름
함수 이름
대입할 상수 값
먼저, 도형의 의미 파악
두 방법 모두 함수에게 인자를 전달한다는 것은 같습니다.
B
Main
A
B A B A
Value Ref.
B
Main
A
B A B A
Value Ref.
다만, 방법에서 차이가 있습니다.
Call by Value의 경우
B
Main
A B A
Value
값을 복사하여 인자로 넘깁니다.
5 7
값 대입
Call by Value의 경우
7
Main
5 B
Value
값을 복사하여 인자로 넘깁니다.
A
Call by Value의 경우
7
Main
5 B
Value
값을 복사하여 인자로 넘깁니다.
A
값 복사
Call by Value의 경우
7
Main
5 7
Value
값을 복사하여 인자로 넘깁니다.
5
Call by Value의 경우
7
Main
5 7
Value
값을 복사하여 인자로 넘깁니다.
5
Call by Value의 경우
7
Main
5 7
Value
값을 복사하여 인자로 넘깁니다.
5
값만 그대로 넘어갔을 뿐
두 함수의 인자 값은 별개
Call by Value의 경우
7
Main
5 7
Value
값을 복사하여 인자로 넘깁니다.
10
Value의 A값을 바꾸어도
Main의 A값은 변화가 없다
Call by Value의 경우
7
Main
5 7
Value
값을 복사하여 인자로 넘깁니다.
5
주소 값을 보면
다르다는 것을 알 수 있다.
Call by Reference의 경우
B
Main
A B A
Ref.
주소 값을 넘깁니다.
5 7
값 대입
7
Main
5 B A
Ref.
Call by Reference의 경우 주소 값을 넘깁니다.
7
Main
5 7 5
Ref.
Call by Reference의 경우 주소 값을 넘깁니다.
7
Main
5 7 5
Ref.
Call by Reference의 경우 주소 값을 넘깁니다.
이렇게 할 수도 있음
7
Main
5 7 5
Ref.
Call by Reference의 경우 주소 값을 넘깁니다.
결과는 동일하다.
7
Main
5 7 5
Ref.
Call by Reference의 경우 주소 값을 넘깁니다.
주소 값을 보면
같다는 것을 알 수 있다.
7
Main
5 7 10
Ref.
Call by Reference의 경우 주소 값을 넘깁니다.
그렇기 때문에
7
Main
10 7 10
Ref.
Call by Reference의 경우 주소 값을 넘깁니다.
이런 식으로…
이렇게 두 가지 방법이 있는 이유는?
가장 널리 쓰이는 예가 Swap 입니다.
Swap을 하기 위해 다음과 같이 함수를 작성합니다.
After의 값이 변화가 없습니다.
Swap을 하기 위해 이번엔 Call by Reference로 해봅니다.
Call by Value의 한계
호출 된 함수에서 값을 변경하더라도 호출 한 쪽에선 변화가 없습니다.
Call by Value의 한계
그래서 Return문을 사용하죠
호출 된 함수에서 값을 변경하더라도 호출 한 쪽에선 변화가 없습니다.
Call by Value의 한계
Call by Value의 한계
두 가지 이상을 반환하고 싶다면 ㅠㅠ
호출 받은 함수에서 원본 인자 값을 건드려야 한다면…
Call by Reference 를 사용
Call by Reference 를 사용
원본 값이 변경될 위험성이 존재
Call by Value 를 사용
실제 데이터 유지 가능
어떤 것이 더 좋고, 안 좋고의 구분은 의미가 없다.