매개변수 전달 ①

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강).

다음 편

받기도 하고 내보내기도 하는 인아웃 모드는 어떻게 만들까요?

6편안에서 바꾸면 밖도 바뀔까? 8강 목록