들어가며
변수가 어떤 종류의 정보를 담고 있는지 이해하는 것은 코드를 추론하고 수정하는 데 결정적인 역할을 합니다.
이스턴 핀란드 대학교의 Jorma Sajaniemi 교수에 따르면, 변수를 이해하기 어려운 이유는 대부분의 프로그래머가 변수를 연관 지을 좋은 스키마를 자신들의 LTM(Long Term Memory)에 가지고 있지 않기 때문이라고 합니다.
Sajaniemi 따르면 우리는 '변수'나 '정수'처럼 너무 많은 것을 포함하는 청크를 사용하거나 numberOfCustomer 같이 너무 적은 것을 포함하는 청크를 사용하는 경향이 있다고 하는데요. 그 중간을 유지하기 위해 변수 역할 role of variables이라는 프레임워크를 만들었다고 합니다.
11가지 역할
Sajaniemi는 다음과 같은 11개의 역할로 대부분의 변수를 설명할 수 있다고 주장합니다.
- 고정값 fixed value
초기화를 통해 값이 할당된 이후 더 이상 변경되지 않는 변수입니다.
e.g. PI, MAX_LENGTH - 스테퍼 stepper
루프를 반복 실행하며 값이 단계적으로 변하는 변수입니다. 따라서 다음 단계가 시작할 때 그 값을 예측할 수 있습니다.
e.g. 루프의 카운터 i - 플래그 flag
무언가 발생했거나 어떤 경우에 해당하는지를 나타내는 변수입니다. 주로 boolean 변수지만, 정수나 문자열도 가능합니다.
e.g. isError - 워커 walker
워커는 스테퍼와 유사하게 자료구조를 순회합니다. 스테퍼와의 차이점은 자료구조를 순회하는 방식인데요.
스테퍼는 항상 미리 정해진 값을 따라 반복하지만, 워커는 루프가 시작되기 전에는 어떤 값을 가지게 될지 알 수 없습니다.
이진 검색에서 리스트를 순회하기 위해 사용할 수도 있지만 스택이나 트리를 순회하는 데 사용될 때가 많습니다.
e.g. currNode - 최근값 보유자 most recent holder
어떤 값이 변해갈 때 가장 최근에 변경된 값을 갖는 변수입니다.
e.g. inputData, element = list[i] - 목적값 보유자 most wanted holder
어떤 값에 대해 반복할 때 그 목적이 어떤 특정한 값을 찾는 것일 수 있습니다. 그 찾고자 하는 값 혹은 현재까지 발견된 값 중에서 찾고자 하는 조건에 부합하는 값을 갖는 변수입니다.
e.g. minimum, maximum - 모집자 gather
모집자는 데이터를 모으거나 모은 데이터에 대해 어떤 연산을 수행하여 얻은 값을 저장하는 변수입니다.
e.g. sum - 컨테이너 container
값을 새로 추가하거나 삭제할 수 있는 자료구조를 나타내는 변수입니다.
e.g. 리스트, 배열, 스택, 트리에 대한 변수 - 추적자 follower
이전 값 혹은 다음 값 등을 추적하는 변수입니다. 항상 다른 변수에 연관되어 있습니다.
e.g. prev, next - 조직자 organizer
때론 추가적인 처리를 위해 변수의 값을 변환해야 합니다. 문자열 내 개별 문자에 접근하기 위해 먼저 문자 배열로 변환하거나, 혹은 주어진 리스트를 정렬한 결과를 따로 가지고 있어야 할 수도 있습니다. 이렇게 다른 값을 저장하기 위한 목적으로 사용하는 변수를 말합니다. 종종 임시 변수이기도 합니다.
e.g. sortedArray - 임시 temporary
잠시만 사용하기 위한 변수입니다. 데이터를 맞바꾸거나 메서드나 함수에서 여러 번 사용되는 계산의 결과를 저장할 때 사용합니다.
e.g. t, temp
이해를 돕기 위해 순서도를 통해 각 역할을 판별해 보겠습니다.
역할의 이점
이 프레임워크가 효과적인 이유는 과연 뭘까요?
바로 몇 개의 역할이 하나로 묶여서 프로그램의 어떤 한 타입을 특징짓는다는 점입니다.
e.g. 스테퍼와 목적값 보유자를 갖는 프로그램은 검색 프로그램
활용 방법
그럼 어떻게 활용할까요?
코드의 변수에 대해 해당하는 역할을 주석으로 달아보며 이해를 도울 수 있습니다.
변수명에 이런 역할명을 포함하면 유용합니다.
const list = [1, 10, 4, 8]; // 컨테이너
let sum = 0; // 모집자
let maximum = -Infility; // 목적값 보유자
// counter - 스테퍼
for (let counter = 0; counter < list.length; counter++) {
const element = list[counter]; // 최근값 보유자
sum += element;
maximum = Math.max(maximum, element);
}
마치며
이번에는 Jorma Sajaniemi의 '변수 역할' 프레임워크에 대해 한번 알아봤는데요.
변수의 역할에 대한 가이드 정도로 생각하시면 될 것 같습니다.
잘못된 부분이 있다면 지적 부탁드립니다.
감사합니다 :D
Reference
The Programmer's Brain 프로그래머의 뇌