2020년 9월 22일 20시 40분 (최근 수정: 2020년 10월 17일 16시 52분)
아래 내용은 인사이트 출판사의 제안으로 작성 중인 책의 초고입니다. 실제 출판 시에는 내용이 달라질 수 있습니다. 많은 의견 부탁드립니다.
다음의 파이썬 프로그램은 18을 출력한다.
이 프로그램은 아래와 같이 바꿀 수 있다.
바뀐 프로그램 역시 18을 출력한다. 차이점은 두 번째 프로그램이 변수(variable)를 사용한다는 것이다. squareOf3이라는 이름을 가지고 3 * 3의 계산 결과를 값으로 하는 변수를 정의했다. 그리고 squareOf3이라는 이름의 변수가 나타내는 값을 두 번 더한 결과를 출력했다.
파이썬 프로그램의 실행 결과는 출력 내용으로만 결정된다고 생각하자. 그러면, 두 프로그램은 똑같이 18을 출력하므로 같은 일을 하는 프로그램이다. 같은 의미의 프로그램이라고 표현할 수도 있다. 따라서 두 프로그램 중 어느 프로그램을 사용해도 상관없는 것이다. 그러나 첫 번째 프로그램보다는 두 번째 프로그램처럼 코드를 작성하는 것이 바람직할 수 있다. 여기에는 크게 두 이유가 있다.
우선, 프로그램의 실행 성능을 변수를 사용해 개선할 수 있다. 첫 번째 프로그램은 3 * 3을 두 번 계산하지만 두 번째 프로그램은 3 * 3을 한 번만 계산한다. 두 번째 프로그램에 더 짧은 실행 시간을 기대할 수 있는 것이다. 물론, 3 * 3은 현대의 컴퓨터에서 매우 짧은 시간 안에 계산되므로 첫 번째 프로그램을 두 번째 프로그램으로 대신하여 성능 향상을 이루기는 어렵다. 오히려 두 번째 프로그램이 더 실행하는 데 오래 걸릴 수도 있다. 그러나 3 * 3이 아니라 훨씬 더 복잡한, 계산하는 데 오래 걸리는 식이 3 * 3 자리에 있었다면 계산을 한 번만 하는 것과 두 번 하는 것은 큰 차이를 낳는다. 그러므로 두 번째 프로그램처럼 변수를 사용해 반복된 계산을 줄이는 것이 바람직하다고 할 수 있다.
코드의 가독성 측면에서도 두 번째 프로그램이 더 낫다고 여길 수 있다. 두 번째 프로그램은 변수의 이름으로 “squareOf3”를 사용했다. 이로써 이 변수가 나타내는 값이 아무런 임의의 값이 아니라 3을 제곱한 값이라는 것을 분명히 했다. 코드를 읽는 사람은 이 프로그램의 목적이 3의 제곱을 두 번 더한 값을 출력하는 것임을 쉽게 알 수 있을 것이다. 물론, 아까도 이야기한 것처럼 위의 예시 프로그램은 너무나도 간단하다. 두 프로그램의 가독성 차이를 느끼기 어렵다. 첫 번째 프로그램을 보더라도 3의 제곱을 두 번 더한 값을 출력하는 프로그램임은 금방 알 수 있다. 그러나 프로그램이 복잡해질수록 어떤 일을 하는 프로그램인지 파악하기 어렵다. 그럴수록 적절히 변수를 정의하고 그 변수에 이해하기 쉬운 이름을 붙임으로써 코드를 이해하기 쉽게 만들 수 있다.
이번 장에서는 변수를 다룬다. 변수를 정의하고 사용할 때 그 프로그램의 의미는 어떻게 정의되는지 알아볼 것이다. 변수는 거의 모든 언어에서 찾아볼 수 있는 매우 기본적이고 중요한 개념이다. 동시에, 묶기(binding)라는 프로그래밍 언어에서 굉장히 중요하게 여기는 개념을 도입한다. 이런 중요성을 고려해 보았을 때, 모든 기능 중 변수를 가장 먼저 다루는 것이 합당하다. 단, 이번 장에서 다루는 변수는 수정 불가능한(immutable) 변수1에 한정된다는 것을 주의하기를 바란다. 수정 가능한(mutable) 변수에 대해서는 7장에서 살펴볼 것이다. 변수는 당연히 수정 가능해야 한다고 생각하는 사람도 있겠지만, 변수를 정의하고 사용하는 것만도 중요한 기능이다. 언어에 수정 가능한 변수를 넣는 것은 추가적인 개념을 많이 필요로 하기에, 처음부터 바로 수정 가능한 변수를 추가하려 했다가는 오히려 변수라는 개념을 명확하게 보여주는 데 어려움이 생길 수 있다. 그러므로 이번 장에서는 변수의 정의와 사용에만 초점을 두고 수정 불가능한 변수를 알아본다.
2장에서 산술
이라는 언어를 정의했다. 이번 장에서는 산술
에 변수를 추가함으로써 산술x
라는 언어를 정의한다. 변수하면 떠오르는 글자는 역시 x다 보니 산술
에 변수가 추가된 언어의 이름은 산술x
이다. 이번 장에서 하는 것처럼, 앞으로의 대부분 장에서도 그 이전에 정의한 언어에 새로운 기능을 추가하는 식으로 이야기를 풀어 나갈 것이다. 시작 언어라고 할 수 있는 산술
이 워낙 작은 언어이다 보니, 책의 초반부에서 정의하는 언어는 실제로 사용되고 있는 언어들과 비교하면 언어라고 부를 수 없을 정도로 기능이 적다. 그러나 기능이 적은 만큼 새롭게 추가되는 기능이 무엇인지, 그리고 그 기능을 추가하기 위해 언어에 어떤 변화가 필요한지 더 명확하게 보일 것이다. 또, 책이 끝날 때쯤에는 실제 언어에 있을 법한 편의 기능들이 적기는 해도, 많은 언어에서 공통적으로 찾아볼 수 있는 기능이 모두 들어간 ‘언어다운’ 언어가 만들어질 것이다.
수정 가능한 변수만을 변수로 간주하는 사람도 있다. 예를 들면, 오캐멀(OCaml) 언어 명세에는 오캐멀에 변수가 없다고 적혀 있다. 이는 변수라는 용어가 가리키는 대상에 수정 불가능한 변수를 포함하지 않기 때문이다. 그러나, 이 책에서는 본문에서 언급한 것처럼, 변수의 핵심은 정의와 사용에 있지, 그 값을 바꾸는 데 있지 않다고 보기 때문에 수정 불가능한 변수도 변수로 취급한다.↩︎