값에 의한 호출과 참조에 의한 호출을 할 수 있습니까?
개념
값에 의한 호출(Call By Value)이란 함수의 매개변수로 값을 받는 경우를 말한다. 즉, 함수 내에서 아무리 그 변수를 변형시켜도 함수를 호출한 원래 함수의 변수는 변화되지 않는다는 것이다.
왜 변화가 일어나지 않느냐 하면, 값에 의한 호출을 할 경우 함수의 매개변수는 그 함수 내에서만 쓰이는 주소에 할당되게 된다. 즉, 원래 변수의 주소와 다른 공간에 저장된다는 뜻이다. 다시 말해, 오직 "값" 만을 참조하는 호출이라는 뜻이 된다.
참조에 의한 호출(Call by Reference)은 이와는 다르게, 매개변수로 주소 값을 받는다. 주소 값을 받을 경우, 받아온 변수의 값을 변화시키면 함수를 호출한 원래 함수의 변수의 값도 함께 바뀌게 된다. 같은 주소이기 때문이다. 이 두 가지 종류의 호출은 사용되는 용도가 다르다.
용도
값에 의한 호출은 함수가 원하는 데이터가 있을 때 주로 사용한다. 호출을 한 원래 함수는 자신이 가진 변수가 함수 호출이 끝난 후에도 계속 유지되기를 바랄 것이다. 그러면서 자신이 가진 값을 정보로 함수에 넘겨주고자 할 때 값에 의한 호출을 하게 된다.
반대로 참조에 의한 호출을 하는 경우에서는 호출을 한 원래 함수는 자신의 변수를 함수가 변형해주기를 바란다. 예를 들면 변화되어야 하는 변수가 많은 경우가 있겠다. 물론 전역변수로 써도 되지만, 이는 여러 가지로 위험한 점이 있기 때문에 자신만 가지고 있는 변수를 여러 개 한꺼번에 변화시키고 싶을 때 참조에 의한 호출을 하게 되는 것이다.
값에 의한 호출 예제
값에 의한 호출은 인자로 넘기는 값을 복사해서 새로운 함수에 넘겨주는 방식으로 값의 복사에 의한 함수 호출을 의미한다.
▲ Call by Value 예제
▲ Call by Value 결과값
Call by Value는 값을 복사해서 전달하기 때문에 원본의 값이 변경될 가능성이 없다는 특징을 가지고 있지만, 값을 넘겨 줄 때마다 고비용, 복사손실의 문제가 발생하는 단점도 있다. Call by Value는 Pass by Value 라고 불리기도 한다.
참조에 의한 호출 예제
참조에 의한 호출은 주소 값을 인자로 전달하는 함수 호출을 말합니다. 아래 예제도 위와 거의 유사하다.
▲ Call by Reference 예제
▲ Call by Reference 결과값
위의 예제에서 알 수 있듯이 Call by Reference는 복사손실과 고비용 문제에서는 벗어났지만, 원본의 값의 변경이 일어 날 수 있다는 중대한 문제점을 안고 있는 걸 볼 수 있다.
커뮤니티 Q&A
위 이론과 관련된 게시글이에요.
이해가 안 되거나 궁금한 점이 있다면 커뮤니티에 질문해 보세요!
게시글 작성하기