매개변수 전달 ①
x에 5를 넣고 sub(x)를 불렀습니다. 돌아온 뒤에도 x는 5일까?
의미 모델
값이 흐르는 방향은 셋
형식 매개변수가 하는 일은 셋 가운데 하나입니다. 값을 받거나(인 모드), 내보내거나(아웃 모드), 둘 다 합니다(인아웃 모드). 이것이 매개변수 전달의 의미 모델입니다.
실 매개변수는 호출문에 적는 값, 형식 매개변수는 헤더에 적힌 자리입니다(2편).
개념적 전달 모델
값을 옮기거나, 가는 길을 넘기거나
실제로 넘기는 방법은 둘입니다. 값 자체를 복사해 옮기거나, 그 값에 닿는 접근 경로(access path)를 넘깁니다. 접근 경로는 보통 그 칸의 주소, 곧 메모리에서의 위치 번호입니다.
칸은 값을 담는 메모리 칸입니다. 값 5는 예시입니다.
예제 하나
같은 코드를 다섯 방식으로 돌립니다
부른 쪽의 x에는 5가 있고, sub는 형식 매개변수 a에 7을 넣습니다. 돌아온 뒤 x의 값은 전달 방식에 따라 달라집니다. 구현 방법 다섯 가지를 이 코드로 차례로 봅니다.
C처럼 적은 예시 코드입니다. void sub(int a)는 정수 a를 받는 sub를 정의한다는 뜻입니다.
① 값 전달 · 인 모드
복사본을 건넵니다
값 전달(pass-by-value)은 실 매개변수의 값으로 형식 매개변수를 초기화합니다. 보통 복사로 구현합니다. 칸이 따로여서, 안에서 a를 바꿔도 밖의 x는 그대로입니다.
초기화는 처음 값을 넣어 주는 것입니다.
값 전달의 비용
큰 값을 넘기면 복사가 큽니다
복사로 구현하면 저장 공간이 하나 더 들고, 배열처럼 큰 값은 복사 비용이 큽니다. 접근 경로를 넘겨 구현할 수도 있지만, 그러면 값을 바꾸지 못하게 막아야 하고 주소를 거쳐 가느라 접근이 느려집니다.
배열은 값 여러 개를 줄지어 담은 것입니다. 칸 열두 개는 예시입니다.
② 결과 전달 · 아웃 모드
끝날 때 값이 밖으로 건너옵니다
결과 전달(pass-by-result)에서는 서브프로그램으로 값이 건너가지 않습니다. 형식 매개변수는 지역 변수처럼 쓰이다가, 제어가 돌아갈 때 그 값이 실 매개변수로 복사됩니다.
값 전달처럼 칸이 하나 더 들고 복사도 해야 합니다.
결과 전달의 문제 ①
같은 변수를 두 번 넘기면
sub(p1, p1)처럼 같은 변수를 두 번 넘기면, 끝날 때 a와 b의 값이 모두 p1 한 칸으로 복사되어 돌아옵니다. 먼저 들어간 값은 덮이고, 나중에 복사된 값이 남습니다.
a = 3, b = 8은 예시입니다. 언어 구현은 그 언어의 컴파일러나 인터프리터를 만드는 일입니다.
결과 전달의 문제 ②
결과는 어느 칸으로 갈까
배열 요소 list[i]와 그 첨자 i를 함께 넘겼고, sub는 i로 돌아갈 값을 2로 바꿉니다. list[i]가 어느 칸인지를 언제 정하느냐에 따라 결과 7이 들어갈 칸이 달라집니다.
값 7, 2는 예시입니다. 요소는 배열에 든 값 하나, 첨자는 그 번호입니다(5강).
다음 편