Sleeep23' space
Front-end Engineer

자바스크립트로 배우는 SICP - 15. 연산들의 추상화와 타입변환

허프만 부호화에 대해서 알아보자. 그리고 복소수를 추상화 해보자...! (사실 별개의 주제인데 겹쳤다는..?)

2023-11-08 | 독서 | 7min


오늘은 정말 정말 좋은 내용이다. 역시 기대를 저버리지 않는 책이다.

이번에는, 이전에 다뤘던 복소수 산술의 추상화 방안으로서 태깅 전략과 패키지에서 한단계 더 추상화한 것을 다룬다. 사실 흐름이 태깅에서 패키지와 비슷하다. 태깅에서는 매번 모든 태그를 붙이는 함수를 작성하기 까다로워지는 것을 피하기 위해 이를 테이블에 등록하는 함수를 작성했었다.

각 패키지는 인수의 형태에 따라 각기 다른 사칙연산 전략을 취했었다. 이를 추상화 장벽으로 나타낸 그림은 다음과 같다.

복소수의 추상화 장벽들

위 그림에서 보여주는 추상화 방법은, 각기 다른 태그를 지닌 사칙연산들에서 한단계 더 추상화된 주어진 인수에 따라 작동하는 사칙연산 즉, 일반적인 사칙연산 함수를 구현할 수 있다는 점이다.

이 과정에서, 테이블에 등록할 패키지는 어떠한 인수를 받는지에 대해서 명시하며 해당 함수가 어떤 연산을 하는지 명시한다면 주어진 인수의 종류에 따라 그에 알맞는 사칙연산이 가능할 것이다.

그런데 여기에도 문제가 있다. 다른 인수들이 오면 어떻게 해야될까? 생각나는 방법대로라면, 모든 인수의 타입에 따른 연산함수를 구현해야한다. 때로는 이러한 모든 가능한 조합에 대한 교차 형식 연산들을 구현하는 함수들을 정의하고 설치하는 것이 최선일 수 있다. 하지만, 이러한 방법은 개별 패키지들을 가산적으로 결합하는 능력을 훼손하며 연산들을 정의하는 코드가 훨씬 많아질 수 있다.

물론 이러한 방법이 안좋은 방법은 절대 아니다. 서로 완전히 무관한 연산들이 서로 완전히 무관한 형식들에 작용하는 일반적인 상황에서는 교차 형식 연산들을 명시적으로 구현하는 것이 번거로워도 어쩔 수 없는 유일한 선택일 수 있다. 하지만, 복소수 산술과 같이 형식의 관련성을 찾는다면 이야기가 달라진다.

유리수 산술연산과 복소수 산술연산은 서로 연관지을 수 있다. 왜냐하면 복소수의 범위 내에 유리수가 포함되기 때문이다! 그렇기에 유리수 산술연산을 진행하는 과정에서 인수의 형변환(coercion)을 진행한다면, 굳이 유리수 산술연산을 구현할 필요가 없어지고 이는 복소수에 포함된다! (여기서 형변환은 복소수의 허수부를 0으로 만들면 된다.)

이렇게 다른 타입의 인수들에 대해서도 인수들 간의 관계를 통해 또 한번 추상화를 진행하는 방식을 읽어보았다… 새삼 추상화가 이렇게 진행될지 예상을 못했다. 대단하다. 그리고 이 데이터 추상화의 뒷 부분은 꼭 다시 읽어봐야 할 것 같다.