1장-함수를 이용한 추상화
1 - 1 프로그래밍의 기본 요소
강력한 프로그래밍 언어는 단순히 컴퓨터가 수행할 과제를 지시하는 수단 이상의 역할을 합니다. 프로그래밍 언어는 우리가 과정에 관한 생각들을 조직화하는 틀로 작용합니다. 따라서 프로그래밍 언어를 고찰할 때는 단순한 아이디어들을 조합해서 더 복잡한 아이디어를 만드는 데 사용하는 수단에 주의를 기울여야 합니다. 모든 강력한 언어는 이를 위해 다음 세 가지 메커니즘을 제공합니다:
- 원시 표현식 (Primitive Expressions): 언어와 관련된 가장 단순한 개체를 나타냅니다.
- 조합 수단 (Means of Combination): 단순한 요소들로부터 복합적인 요소를 만드는 데 사용됩니다.
- 추상화 수단 (Means of Abstraction): 복합적인 요소들에 이름을 붙여서 하나의 단위로 다루는 데 사용됩니다.
프로그래밍에서 우리가 다루는 요소들은 크게 함수와 데이터로 나뉩니다. 데이터는 우리가 조작하고자 하는 재료이고, 함수는 데이터를 다루는 규칙들을 서술한 것입니다. 따라서 모든 강력한 프로그래밍 언어는 반드시 원시 데이터와 원시 함수를 서술하는 기능이 있어야 하고, 그런 함수들과 데이터를 조합하고 추상화하는 수단들도 제공해야 합니다.
이번 장에서는 함수를 구축하는 규칙들에 집중하기 위해 단순한 수치 데이터만 다루기로 합니다. 이후의 장들에서 보겠지만, 이번 장의 규칙들은 복합 데이터를 조작하는 함수를 구축하는 데에도 적용됩니다.
1.1.1 표현식
프로그래밍을 처음 배울 때 유용한 접근 방식 중 하나는 전형적인 상호작용 방식에 따라 자바스크립트 해석기를 직접 사용해 보는 것입니다. 사람과 해석기의 전형적인 상호작용 방식이란, 사람이 해석기의 프롬프트에서 하나의 문장을 입력하고, 해석기가 그 문장을 평가해서 그 결과를 화면에 표시하는 것입니다. 표현식 문장은 표현식과 세미콜론으로 구성됩니다. 표현식은 하나 이상의 원시 표현식으로 구성되는데, 여러 원시 표현식 중 하나로 수가 있습니다. 예를 들어 자바스크립트 해석기에 다음과 같은 코드를 입력하면 해석기는 다음과 같은 평가 결과를 출력합니다.
486; // 486
수를 나타내는 표현식들을 연산자(+, *)로 조합할 수 있습니다. 그 결과는 연산자들에 해당하는 원시 함수를 해당 수들에 적용하는 하나의 복합 표현식입니다. 다음은 그러한 복합 표현식들의 예입니다.
137 + 349; // 486
1000 - 334; // 666
5 * 99; // 495
10 / 4; // 2.5
2.7 + 10; // 12.7
이처럼 다른 표현식을 구성요소로 담고 있는 표현식을 가리켜 조합이라고 부릅니다. 연산자 조합의 값은 연산자로 지정된 함수를 인수들, 즉 피연산자 값들에 적용해서 구합니다. 연산자를 두 피연산자 사이에 배치하는 관례를 중위 표기법이라고 부릅니다. 중위 표기법은 학교와 일상생활에서 익숙한 수학 표기법과 동일합니다. 수학에서 수식 안에 수식을 중첩하는 것처럼 연산자 조합도 중첩할 수 있습니다. 즉, 연산자 조합 자체를 다른 연산자 조합의 피연산자로 사용할 수 있습니다.
자바스크립트에서도 연산 순서의 혼동을 피하기 위해 소괄호로 연산자 조합들을 묶을 수 있습니다. 소괄호를 생략하면 자바스크립트는 통상적인 관례에 따라 연산 순서를 결정합니다. 예를 들어 다음은 3 _ 5 + 10 / 2는 (3 _ 5) + (10 / 2)에 해당합니다. 이는 연산자 *와 /가 연산자 +와 -보다 우선순위가 높다는 것을 의미합니다.
일련의 덧셈과 뺄셈, 곱셈과 나눗셈도 마찬가지로 오른쪽에서 왼쪽으로 평가됩니다. 예를 들어 1 - 5 / 2 _ 4 + 3는 (1 - ((5 / 2) _ 4)) + 3에 해당합니다. 이를 연산자가 왼쪽 결합이라고 합니다.
표현식들의 중첩과 자바스크립트 해석기가 평가할 수 있는 표현식의 전반적인 복잡도에는 이론적으로 제한이 없습니다. 예를 들어, 3 _ 2 _ (3 - 5 + 4) + 27 / 6 * 10는 자바스크립트 해석기에 의해 쉽게 57로 평가될 수 있습니다.
복잡한 표현식 문장이 주어져도 해석기는 항상 동일한 기본 주기로 작동합니다. 해석기는 사용자가 입력한 문장을 읽고, 그 문장을 평가하고, 결과를 출력합니다. 이러한 주기를 반복하는 것을 **REPL (read-evaluate-print loop)**이라고 부릅니다. 자바스크립트 REPL에서 출력을 위해 특별한 명령이 필요하지 않음을 주목하십시오. 해석기는 주어진 표현식의 평가 결과를 자동으로 출력합니다.
1.1.2 이름 붙이기와 환경
계산적 객체에 이름을 붙여서 그 이름으로 객체를 지칭하는 수단은 프로그래밍 언어의 필수 기능입니다. 자바스크립트에서 상수에 이름을 붙이는 방법은 const 키워드를 사용하는 상수 선언입니다. 상수 선언을 통해 특정 값을 하나의 이름에 연관시킬 수 있습니다.
예를 들어, 다음 코드에서 해석기는 숫자 2를 size라는 이름에 연관시킵니다. 이제부터 size라는 이름은 값 2를 지칭합니다.
const size = 2;
size; // 2 5 * size; // 10
다음은 const를 사용하여 상수를 선언하고 이를 표현식에 사용하는 예입니다.
const pi = 3.14159; const radius = 10;
const area = pi _ radius _ radius; area; // 314.159
const circumference = 2 _ pi _ radius; circumference; // 62.8318
이처럼 복합적인 연산의 결과를 간단한 이름으로 지칭할 수 있다는 점에서 상수 선언은 가장 단순한 추상화 수단입니다. 예를 들어 circumference는 계산된 원의 둘레를 지칭합니다. 복잡한 구조의 계산적 객체를 사용할 때마다 그 구조를 반복해서 명시하는 것은 불편하므로, 상수 선언을 통해 복잡한 구조의 세부 사항을 기억하고 관리할 수 있습니다.
이름과 값을 연관시키고 이름으로부터 값을 조회하려면 해석기는 이름-객체 쌍을 저장하고 관리하는 특정한 메모리 공간을 필요로 합니다. 이 메모리 공간을 **환경(environment)**이라고 부릅니다. 하나의 계산에 다수의 환경이 관여할 수 있으며, 여기서 말하는 환경은 프로그래밍 환경을 의미합니다.
질문과 답변
질문 1: 상수 선언이 왜 중요한가요?
답변: 상수 선언은 복합적인 연산 결과를 간단한 이름으로 지칭할 수 있게 해줍니다. 이는 코드 의 가독성을 높이고, 유지보수성을 향상시키며, 오류를 줄이는 데 도움이 됩니다. 상수 선언을 통해 복잡한 계산적 객체의 세부 사항을 반복해서 명시할 필요 없이 간편하게 사용할 수 있습니다.
질문 2: 왜 const 키워드를 사용하나요?
답변: const 키워드는 변하지 않는 값을 선언할 때 사용됩니다. 이를 통해 의도하지 않은 값의 변경을 방지하고, 코드의 안정성을 높일 수 있습니다. const로 선언된 변수는 재할당이 불가능하므로, 상수로서의 역할을 확실히 합니다.
질문 3: 상수 선언의 장점은 무엇인가요?
답변: 상수 선언의 주요 장점은 다음과 같습니다:
- 가독성 향상: 의미 있는 이름을 사용하여 코드를 더 쉽게 이해할 수 있습니다.
- 유지보수 용이: 값을 한 번만 정의하면 여러 곳에서 재사용할 수 있어, 수정이 필요할 때 선언 부분만 변경하면 됩니다.
- 오류 감소: 실수로 값을 변경하는 것을 방지하여, 버그 발생 가능성을 줄입니다.
질문 4: 환경(environment)이란 무엇인가요?
답변: 환경은 이름과 값을 연관시킨 이름-객체 쌍을 저장하고 관리하는 메모리 공간을 의미합니다. 프로그래밍에서 변수나 상수의 이름과 그 값을 저장하고 필요할 때 조회할 수 있게 합니다. 여러 개의 환경이 존재할 수 있으며, 이는 변수의 스코프(scope)와 밀접한 관련이 있습니다.
질문 5: 어떻게 환경이 프로그래밍에 기여하나요?
답변: 환경은 변수와 상수의 값을 저장하고 관리하여 프로그램이 올바르게 작동하도록 합니다. 변수의 스코프를 관리하고, 변수 충돌을 방지하며, 함수 호출 시 각기 다른 환경을 유지하여 상태를 관리합니다. 이는 프로그램의 구조화와 복잡한 연산 처리에 필수적입니다.
추가 설명
상수 선언과 함수 선언의 차이점: 상수 선언은 변하지 않는 값을 선언하는 데 사용되고, 함수 선언은 특정 작업을 수행하는 코드를 정의하는 데 사용됩니다. 예를 들어, 다음과 같은 함수 선언은 원의 면적을 계산하는 함수를 정의합니다:
function calculateArea(radius) {const pi = 3.14159;return pi * radius * radius;}const radius = 10;const area = calculateArea(radius);console.log(area); // 314.159
이 예제에서 calculateArea 함수는 주어진 반지름 값을 받아 원의 면적을 계산합니다. 함수 선언을 통해 코드를 재사용하고, 복잡한 계산을 단순화할 수 있습니다.
이러한 질문과 답변을 통해 상수 선언과 환경의 중요성 및 역할을 이해하고, 이를 실제 프로그래밍에 어떻게 적용할 수 있는지 배울 수 있습니다.