프로그래밍 언어를 배우거나 혹은 가르치거나
Posted by 미스란디르
C를 배운지 얼마 안된 사람이 다음과 같은 질문을 했다고 쳐보자.
"값을 반환 했는데 먼가 잘 안돼요."
그래서 소스를 살펴본다.
int sum_and_multiple(int a, int b)
{
int sum = a + b;
int mul = a * b;
return sum, mul;
}
약간 특이하다. 저건 컴파일할때 에러가 아닌데, (적어도 GCC에선) 그렇다고 값을 두개를 반환하는가 하면 그것도 아니다. C의 함수 구현은 저런 반환값을 허용하지 않는다. 저건 잘못됐다고 살짝 야단을 치면서 혹은 친절하게 지난번에 가르쳐준 call-by-reference를 복습시켜준다.
정답은 물론 다들 아시는 것 처럼 이렇다.
void sum_and_multiple(int a, int b, int *sum, int *mul)
{
*sum = a + b;
*mul = a * b;
}
정말 그걸로 된걸까?
요즘엔 이런 생각이 든다. 이러한 설명 과정에 의해서 자연스러운 사고방식이 또 하나 없어져가는게 아닐까, 라고. 함수가 값을 반환한다고 배웠다면 값을 꼭 하나가 아니라 여러개 반환하는 건 안될까? 라고 생각하는 것은 너무나도 당연한 생각이다.
조금 다르게 struct 형을 반환하거나, struct를 동적할당해서 그 포인터를 반환하는 방법이 있다.
하고싶은 것에 비해 들이는 노력이 너무 많다.
이러한 동작들이 어째서 안되는지를 설명하기 위해서는 C의 구현, 컴퓨터의 동작방식
레지스터와 스택등을 설명하지 않으면 안된다. (이제와서 생각해보건데, 두개가 안될
이유가 별로 없어 보인다. x86이라면 ax나 eax대신 스택으로 반환값을
처리한다거나 하면 되지 않겠는가?)
하지만 그건 어찌보면 좀 가혹한 얘기이고 흥미를 잃을 수도 있다.
여기서 루비나 파이썬 혹은 LISP같은 프로그래밍 언어를 잠깐만 소개해주면 어떨까? '이건 무조건 안된다.' 'call-by-reference로 하렴' 대신, 가능 한 경우도 있다고 알려준다.
def sum_and_multiple(a, b)
sum = a + b
mul = a * b
return sum, mul
혹은
def sum_and_multiple(a, b)
sum = a + b
mul = a * b
sum, mul
end
혹은
(defun sum_and_multiple (a b) (LIST (+ a b) (* a b)))
딴 얘기지만 python이랑 루비는 지향하는 바가 다르면서도 키워드가 비슷해서 그런지 참 비슷하게 생겼다.
루비에서도 return을 쓸 수 있으니 return sum, mul 하면 end빼고 똑같지 않은가!
이제 처음 프로그래밍을 배우기 시작해서 C를 익히는 사람에게 다른걸 보여줘봐야 무슨 소용이 있나 싶기도 하다. 하지만 무조건 프로그래밍 언어에 자신을 끼워 맞추기 보다는 또 다른 세계가 있다는 것을 알려주는 것이 좀 더 올바른 교습방법이 아닐까 하는 생각이 든다. 물론 가르치는 사람이 몰라서 안가르쳐 주는 경우가 더 많겠지만.

return sum, mul은 의도한 것은 두개를 return하고자 했으나 문법적으로는 틀린 표현이 아닙니다.
엇 그렇군요.
은 될테니까, 그렇게 되겠네요. semantics는 틀렸지만 syntax는 문제가 없군요.