Languages/Erlang2008. 9. 1. 11:30

프로그래밍 언어를 배울 때 가장 처음 배우게 되는 것 중 하나가, 해당 프로그래밍 언어가 지원하는 타입 시스템에 관한 것입니다. 프로그래밍 언어라는 것이 기본적으로 자료(data)를 어떻게 조작할 것인가에 관한 것이기 때문에, 이 타입(type)에 관한 지식은 프로그래밍 언어를 배우기 시작할 때 가장 기본적으로 알아야 하는 부분이라고 할 수 있겠습니다.

C언어에서 (Java, C++같이 정적인 타입 시스템을 지원하는 대부분의 프로그래밍 언어에서 그렇습니다만) 타입 시스템은 다음의 큰 구성요소들을 가진다고 할 수 있습니다.

1. 기본(primitive) 타입
2. 포인터(pointer) 타입
3. 구조체

C++이나 Java같으면 여기에 클래스(class)같은 것들이 추가될 수 있겠습니다만, C에서는 적어도 타입과 관련되어서는 저 세 가지 큰 줄기가 존재한다고 할 수 있습니다. 하지만 Erlang은 어떨까요?

Erlang에서는 다음의 네 가지 큰 줄기가 존재한다고 할 수 있습니다.

1. 기본 타입
2. 애텀(atom)
3. 투플(tuple)
4. 리스트(list)

C와 같은 프로그래밍 언어에서는 타입이 존재하면 그것으로 변수를 선언하고, 거기에 해당 타입에 맞는 값을 할당하여 조작하는 것이 가능합니다. 그러니 보통 그런 프로그래밍 언어를 배울 때에는 먼저 '무슨 무슨 타입이 있다'는 것을 배우게 되고, 그 다음에는 아래와 같이 그 타입을 사용하는 방법을 배우게 됩니다.

int a;
a = 3;

하지만 Erlang은 변수의 타입이 동적으로 결정되기 때문에 (변수에 값을 할당하는 순간에 결정됩니다) C와 같이 명시적으로 타입을 지정해 주는 등의 작업이 사실상 필요가 없습니다. erl을 실행하여 Erlang 셸을 띄운 다음에, 다음과 같이 입력해 보도록 하죠. (Erlang 시스템이 이미 깔려있다고 가정했습니다.)

Eshell V5.5.5  (abort with ^G)
1> X = 7.
7
2>

X에 7이라는 값이 할당된 것 처럼 보입니다. (모든 Erlang 식은 실행되고 나면 그 결과를 반환하므로, 7이 화면에 출력되었습니다.) 이 예제를 보면, 변수의 타입을 int 라고 지정하지 않았는데도 값을 줄 수 있음을 알 수 있습니다.  놀랍지 않나요? 그런데 사실 이런 식으로 변수의 타입을 동적으로 결정하는 언어들은 이미 많이 있습니다. Ruby같은 프로그래밍 언어도 그렇죠. 얼핏 보면 '스크립트 언어'와 유사해 보이는 이들 언어들은 (Ruby, Perl 등등) 이런 동적인 타입 시스템을 특징으로 하는 경우가 많습니다.

자. 그러면 이 변수의 값을 바꾸어보도록 하죠. 다음과 같이 하면 될 것 같습니다.

2> X = 9.

=ERROR REPORT==== 1-Sep-2008::11:12:09 ===
Error in process <0.31.0> with exit value: {{badmatch,9},[{erl_eval,expr,3}]}

** exited: {{badmatch,9},[{erl_eval,expr,3}]} **
3>

웁스. 안되는군요. 사실 이 부분이 Erlang과 다른 프로그래밍 언어의 가장 결정적인 차이라고 할 수 있습니다.

Erlang에서는 한번 할당된 변수의 값을 바꿀 수가 없습니다. 즉, 변수에 side-effect를 발생시킬 수가 없습니다. 이 점은 C나 C++, Java, Ruby같은 procedural 언어의 후손들을 사용해 프로그래밍을 하는 프로그래머에게는 굉장히 당황스러운 부분입니다. 변수의 값을 바꿀수가 없다니요? 그렇다면 배열(Erlang에서는 리스트가 그에 해당하겠군요)에 저장된 값은 어떻게 계산해야 하나요?

이런 시스템을 이해하기 위해서는, Erlang의 변수(variable)라는 것들이 사실은 '전혀 variable'하지 않으며, 오히려 = 연산자 우측에 등장하는 값에 대한 '대응(matching)' 결과라는 사실을 이해할 필요가 있습니다. 즉, 위의 예제에서 X = 7. 과 같이 하고 나면 X와 7 사이에는 변수 이름 X로 유일하게 식별되는 대응 관계가 성립하고, 한번 성립된 대응 관계는 변경할 수 없게 되는 것입니다.

그러니 X = 9.와 같이 그 대응 관계를 변경하려고 하면 안될 밖에요.

이처럼 Erlang의 '변수'가 '대응 연산'의 결과물이라는 특성 때문에, Erlang의 = 연산자 좌측 (이 연산자도 '대입' 연산자가 아니라 사실은 '대응' 연산자라고 불러야 합니다)에는 다른 기존 프로그래밍 언어에서는 허용될 수 없는 식(expression)들이 올 수 있습니다. 그런 예제들은 나중에 살펴보도록 하죠.


[다음 글에서 계속...]


Posted by 이병준

소중한 의견, 감사합니다. ^^