(Lispex)sicp.io
2.1 · 추상화 장벽

표현이 아니라 인터페이스로 만든다.

생성자와 선택자를 사용하면 프로그램 곳곳에 순서쌍 표현 방식을 퍼뜨리지 않고 유리수를 사용할 수 있습니다.

생각해 볼 질문

추상화 장벽은 어떤 변경에서 우리를 보호해 줄까요?

  • 추상 값과 그 표현을 구분하기
  • 생성자와 선택자만 경계로 사용하기
  • 추상화 안쪽으로 직접 들어가는 코드 알아보기

make-rat은 유리수 값을 만들고 numer와 denom은 그 부분을 꺼냅니다. add-rat은 car나 cdr, 또는 순서쌍에 두 항목을 넣은 순서를 직접 알 필요 없이 세 프로시저에만 의존합니다.

순서쌍은 유용한 구현 장치이지만 공개해야 할 생각 그 자체는 아닙니다. 표현 방식에 대한 지식을 작은 인터페이스 뒤에 두면 나중의 변경이 다른 코드까지 퍼지지 않습니다.

리스펙스 · SICP 코드SICP에 필요한 Scheme 호환 문법을 리스펙스 SICP 프로필로 실행합니다.
(begin
  (define (make-rat n d) (cons n d))
  (define (numer x) (car x))
  (define (denom x) (cdr x))
  (define (add-rat x y)
    (make-rat (+ (* (numer x) (denom y))
                 (* (numer y) (denom x)))
              (* (denom x) (denom y))))
  (let ((answer (add-rat (make-rat 1 2) (make-rat 1 3))))
    (/ (numer answer) (denom answer))))
리스펙스 학습용 런타임리스펙스 SICP 프로필 1.0.0
리스펙스 SICP 런타임 불러오는 중
리스펙스 · SICP 코드UTF-8 346 / 1,048,576바이트
예제
결과
출력
진단
보이는 실행 흐름0 / 0 개의 실행 이벤트
    이 브라우저 결과는 리스펙스 바우치나 권한이 아닙니다.wasm —
    예상 관찰

    첫 프로그램은 정확한 유리수 값 5/6을 반환합니다.

    실행 흐름에서 볼 점

    make-rat과 numer와 denom 호출을 따라가세요. add-rat은 순서쌍 연산을 직접 쓰지 않으므로 저장 순서를 실행 과정에 드러내지 않습니다. 이 실행 흐름은 한 번의 실행을 보는 제한된 학습 화면이며 리스펙스 바우치나 권한이 아닙니다.

    직접 해보기

    힌트를 보기 전에 프로그램을 바꿔 보세요.

    make-rat에서 분모를 먼저 저장하세요. numer와 denom만 바꾼 다음 add-rat이 여전히 5/6을 반환하는지 확인하세요.

    힌트 하나 보기

    add-rat까지 바꿔야 한다면 표현 방식에 대한 지식이 추상화 장벽을 넘어온 것입니다.