토파즈 배우기

실제 파일 읽기

처음 보는 소스 파일을 열어 한 줄씩 다 읽지 않고도 구조와 계약과 실패 경로를 찾아냅니다.

학습 결과: 내가 쓰지 않은 파일을 열어 한 줄씩 읽지 않고도 구조와 계약과 실패 지점을 찾아냅니다.

선행 학습: 첫 애플리케이션을 마치세요. 작은 프로그램을 쓰는 일과 큰 프로그램을 읽는 일은 다른 기술이고, 이 페이지는 두 번째 것을 다룹니다.

읽기는 쓰기를 거꾸로 하는 게 아닙니다

큰 파일에서 질문 하나의 답을 찾을 때 위에서 아래로 전부 읽는 방법이 가장 빠른 경우는 드뭅니다. 익숙한 사람은 이정표를 훑어 대략의 지도를 만들고, 그다음에 필요한 부분만 자세히 읽습니다. 다음 네 종류의 이정표는 파일에 나타날 때마다 유용합니다.

네 번 훑으면 방향이 잡힙니다. 한 번에 몇 초씩이면 됩니다.

첫 번째, 임포트

맨 위 몇 줄이 이 파일이 무엇에 기대고 있는지를 다른 어떤 정보보다 먼저 알려 줍니다.

TOPAZ
import std.bytes { Bytes }
import std.json

임포트는 이름을 붙여 가져온 모듈 의존성을 보여 줍니다. 임포트가 많으면 여러 부분을 조율하는 파일일 가능성이 크지만, 임포트가 없다고 호스트와 상호작용하지 않는다는 뜻은 아닙니다. 프렐류드 연산과 선택한 제품 프로필도 함께 봐야 합니다. 이 단계는 빠른 지도이지 증명은 아닙니다.

두 번째, 형태

명사를 찾으세요. 레코드는 그 종류의 값이 갖춰야 할 형태를 선언하고, 대개 어떤 주석보다 빠르게 이 파일이 무엇에 관한 것인지 알려 줍니다.

TOPAZ
record StudySession {
    topic: string,
    minutes: int,
    finished: bool
}

function summarize(session: StudySession) -> string {
    if session.finished {
        return "{session.topic}: done"
    }
    "{session.topic}: {session.minutes} minutes left"
}

레코드만 읽어도 이 파일이 주제와 소요 시간과 완료 여부를 가진 학습 세션을 다룬다는 걸 이미 알게 됩니다. 로직은 한 줄도 안 읽고 무엇에 관한 파일인지 알아낸 겁니다.

세 번째, 서명

이제 함수 서명만 읽고 본문은 전부 건너뛰세요. 서명은 계약이고, 계약들이 모이면 이야기가 됩니다.

위 예제에서 summarize는 세션을 받아 문자열을 주겠다고 약속합니다. 서명은 입력과 결과의 형태를 고정하고, 반환 타입이 Result라면 복구 가능한 실패도 드러냅니다. 다만 파일이나 입출력 권한까지 서명 하나에 모두 적히는 것은 아닙니다. 그런 권한은 선택한 제품 프로필도 함께 결정합니다.

따라서 서명 훑기는 유용하지만 범위가 분명합니다. 서명을 죽 읽으면 데이터와 복구 가능한 실패의 윤곽이 잡힙니다. 호스트 권한을 판단할 때는 임포트와 패키지 프로필도 함께 보고, 그다음 질문과 관련된 본문 하나만 파고들면 됩니다.

네 번째, 실패 경로

마지막으로 이 파일이 일이 잘못될 수 있다고 인정하는 자리를 찾으세요. 서명에서는 Result를, 본문에서는 ? 표시를 봅니다.

결과 타입이 Result인 함수는 실패할 수 있으니 호출하는 쪽이 처리하라고 말하고 있습니다. 본문의 ? 표시는 그 지점의 실패를 여기서 처리하지 않고 호출한 쪽으로 올려보낸다는 뜻입니다. 둘을 합치면 오류 처리를 자세히 읽지 않고도 파일을 관통하는 오류 경로가 그려집니다.

Result가 어디에도 없다면 그 서명들은 복구 가능한 실패를 밖으로 내보내지 않습니다. 그렇다고 실행 오류가 절대 없거나 호스트 연산이 없다는 뜻은 아닙니다. 반환되는 오류와 실행을 중단시키는 오류를 구분해서 읽으세요.

이제 실제 파일로 해 보기

이 문서의 아무 예제 소스나, 아니면 직접 만든 first-application 프로젝트에 네 번 훑기를 적용해 보세요. 임포트, 형태, 서명, 실패 경로 순서로요. 함수 본문을 한 번도 자세히 읽지 않은 상태에서 이 파일이 무엇을 위한 것인지 한 문장으로 말할 수 있어야 합니다.

네 단계 중 어디서 막히면 참조 문서가 정확한 형태를 설명합니다. 형태는 레코드와 명목 데이터, 서명은 함수와 제네릭, 실패 경로는 Null·Option·결과·실행 오류에 있습니다.

직접 해 보기

summarize 함수를 다시 읽고 실행하지 않은 채 답해 보세요. 반환된 문자열만 받은 코드가 그 타입만 보고 세션이 끝났는지 알 수 있나요?

정답

알 수 없습니다. 서명은 두 경우 모두 문자열을 약속하므로, 그 결과만 가진 코드는 글자를 뜯어봐야 구분할 수 있습니다. 그건 부서지기 쉬운 방법입니다. 뒤에서 쓰는 코드가 완료 상태를 정말 알아야 한다면 문장에 숨기지 말고 구조화된 결과에 담아 반환하세요. 본문을 읽지 않고 서명만으로 이걸 알아채는 것이 세 번째 훑기의 목적입니다.

이어갈 준비가 된 시점

처음 보는 파일을 열어 의존 대상과 주요 형태와 계약 두 개와 실패 지점 하나를, 한 줄씩 다 읽지 않고 1분 안에 짚을 수 있으면 됩니다.

참조 문서도 방금 읽은 순서대로 짜여 있습니다. 문법 한눈에 보기가 형태 자체를 가장 빠르게 훑는 지도입니다.