학습 결과: 소형 프로그램을 분석하여 각 코드 행이 최종 출력 결과에 기여하는 역할을 기술 어휘로 설명할 수 있습니다.
선행 학습: 없습니다. 프로그래밍 경험이 없는 입문자를 전제로 작성되었습니다. 이미 프로그래밍 기초를 이해하고 있다면 첫 프로그램 문서로 건너뛰세요.
프로그램은 명령이 아니라 설명입니다
프로그래밍을 컴퓨터에 하나씩 명령을 내리는 작업으로 이해하기 쉽지만, 실제로는 시스템이 수행해야 할 명세를 기술하는 작업에 가깝습니다. 모호함이 없는 명확한 명세 말입니다. 처리할 데이터의 구조와 동작을 명확히 기술하면 시스템은 해당 명세를 그대로 수행하며, 작성된 오류나 실수까지 포함하여 서술된 명세대로 구동됩니다.
이 마지막 특성이 프로그래밍의 핵심입니다. 시스템은 작성자의 의도를 임의로 추론하거나 짐작하지 못합니다. 프로그래밍 언어를 습득하는 목적은 모호함 없이 의도한 로직을 서술하는 방법을 익히는 데 있습니다.
네 가지 개념이면 거의 다 덮습니다
작성되는 대부분의 프로그램은 네 가지 핵심 요소로 구성됩니다.
값은 단일 데이터 단위입니다. 숫자 45, 문자열 "공부 계획", 불리언 값인 참과 거짓 등이 이에 해당합니다. 예제 코드의 5행부터 7행에 등장하는 "study plan", 45, 20 같은 요소가 값에 해당합니다.
이름은 추후 재참조하기 위해 값에 부여하는 식별자입니다. let 전체 = 45 구문을 작성하면 값 45에 전체라는 식별자가 할당됩니다. 예제 코드에서 let 계획, let 전체, let 사용으로 지정된 계획, 전체, 사용이 이름에 해당합니다.
함수는 이름이 부여된 연산 단위입니다. 인자를 전달받아 연산을 수행한 후 결과값을 반환합니다. 동일한 계산 로직을 여러 위치에서 재사용하기 위해 정의합니다. 예제 코드의 1행부터 3행에 작성된 function 남은분... 블록이 함수 정의에 해당합니다.
실행은 서술된 명세를 순차적으로 처리하여 최종 결과를 출력하는 시점입니다. 예제 코드 9행의 print 구문과 소스 파일의 명세를 구동하여 출력을 얻는 전체 과정이 실행에 해당합니다.
네 가지 요소는 하나의 소스 파일에 함께 구성됩니다.
function 남은분(전체: int, 사용: int) -> int {
전체 - 사용
}
let 계획 = "study plan"
let 전체 = 45
let 사용 = 20
print("{계획}: {남은분(전체, 사용)} minutes left")이름 뒤의 : int는 그 자리에 정수가 온다는 표시이고, -> int는 이 함수가 정수를 돌려준다는 표시입니다. 이 표기는 다음 수업에서 정식으로 다루므로 지금은 이 정도만 알고 넘어가도 됩니다.
토파즈가 설치되어 있다면 what-a-program-is.tpz 파일로 저장한 뒤 아래 명령으로 검사하고 실행하세요. 아직 설치하지 않았다면 지금은 내용을 읽고 이해하는 것으로 충분합니다. 다음 첫 프로그램 단계에서 직접 파일 작성 전 도구부터 설치합니다.
topaz check what-a-program-is.tpz
topaz run what-a-program-is.tpz출력 결과는 다음과 같습니다.
study plan: 25 minutes left결과에서 거꾸로 코드를 읽어 봅니다
출력 결과에서 시작하여 소스 코드를 역추적해 볼 수 있습니다. study plan 문자열은 식별자 계획에서 전달된 것이며, 해당 식별자는 값 "study plan"을 참조합니다. 숫자 25는 소스 코드에 직접 기재되어 있지 않으며 남은분 함수가 45와 20을 인자로 받아 연산한 결과입니다.
함수 정의를 다시 확인하면 첫 행에서 시그니처를 명시합니다. 정수형 매개변수 두 개를 받아 각각 전체와 사용으로 명명하며, 정수형 반환값을 구체화합니다. 본문은 단일 표현식으로 구성되며 표현식 전체 - 사용의 평가 결과가 그대로 반환값으로 산출됩니다. 이 연산에 필요한 데이터가 매개변수 두 개로 명시되므로 소스 코드의 다른 요소가 해당 함수의 연산 동작을 변경할 수 없습니다.
이러한 특성은 유용합니다. 전달된 인자에만 의존하는 계산 로직은 전체 프로그램 상태를 고려하지 않고 개별적으로 분리하여 검증할 수 있습니다.
검사 단계가 따로 있는 이유
단일 실행이 아니라 정적 검사와 실행의 두 명령을 수행했습니다. 검사 단계는 실행 전에 서술된 명세를 분석하여 문법적·논리적 오류를 탐지합니다. 남은분(전체)과 같이 필수 인자를 누락하여 호출하면 검사 단계에서 해당 위치를 지적하며 실행 단계로 진입하지 않습니다.
일부 동적 실행 환경은 해당 호출이 구동되는 시점에 누락된 인자를 인지하지만, 정적 검사를 지원하는 언어는 사전 단계에서 오류를 검출합니다. 토파즈는 실행 전 이를 확인하는 명령을 제공하므로 본 예제에서는 check 명령을 먼저 구동합니다.
직접 해 보기
사용 변수를 50으로 변경하고 나머지는 그대로 두세요. 실행하기 전에 출력 결과를 예상해 보세요.
정답
study plan: -5 minutes left가 출력됩니다. 뺄셈 연산은 기술된 명세대로 수행되며, 연산 결과가 양수여야 한다는 제약 조건은 명세 어디에도 정의되어 있지 않습니다. 음수 값이 요구사항에 부합하지 않는다면 해당 규칙 역시 소스 코드에 명시해야 합니다. 이 결과에 프로그래밍의 핵심 원리가 담겨 있습니다. 시스템은 개발자가 의도한 바가 아니라 작성된 명세를 그대로 따릅니다.
이어갈 준비가 된 시점
단일 값, 식별자, 함수의 시그니처, 결과를 산출하는 표현식을 각각 구분할 수 있고, 검사 명령과 실행 명령의 역할 차이를 설명할 수 있으면 충분합니다.
첫 프로그램 문서에서 도구를 설치하고 첫 소스 파일을 직접 작성해 보세요. 이미 다른 프로그래밍 언어를 습득한 상태라면 다른 언어에서 오셨다면 문서가 기존 지식과 새로운 개념을 연결해 줍니다.