트랙
/
Common Lisp
Common Lisp
/
학습 과정
/
해시 테이블
해시

해시 테이블 에서 Common Lisp

4개의 연습 문제

해시 테이블 소개

Common Lisp의 해시 테이블은 연관 데이터를 저장하기 위한 자료 구조예요. 키를 값에 대응시키는데, 키와 값 모두 어떤 객체든 될 수 있어요.

해시 테이블 만들기

해시 테이블은 make-hash-table 함수로 만들 수 있어요.

make-hash-table 함수는 해시 테이블의 초기 크기와 크기 재조정 임계값을 세밀하게 조정하기 위한 여러 키워드 매개변수를 받아요. 이런 값들에 대한 자세한 내용은 문서를 참고해요. 더 중요한 것은, 키와 값을 삽입하고 조회하고 제거할 때 키를 어떻게 비교할지 정의하는 test 키워드 매개변수도 받는다는 점이에요. test 인자로 쓸 수 있는 값은 'eq, 'eql, 'equal, 'equalp 중 하나이고, 이들은 일반 동등성 술어에 대응해요. 기본값은 'eql이에요.

해시 테이블의 주요 연산

키로 값을 가져오려면 gethash를 사용해요. gethash는 키가 해시 테이블에 없을 때 반환할 값 역할을 하는 [선택적 인자][concept-defualt-arguments]를 받아요. gethash는 여러 값도 반환하는데, 이건 다른 개념에서 설명해요. 첫 번째 값은 해시 테이블에서 그 키에 대응하는 값이고, 기본값을 지정했다면 그 기본값이며, 키가 없으면 NIL이에요. 두 번째 값은 키가 해시 테이블에 있었는지 여부를 나타내는 불리언이에요.

키와 값의 쌍을 넣으려면 gethash와 함께 setf를 사용해요.

키와 그 값을 제거하려면 remhash를 사용해요.

모든 키와 값을 제거하려면 clrhash를 사용해요.

Common Lisp의 해시 테이블은 다른 언어에서처럼 순서가 보장되지 않지만, 때로는 각 키와 값의 쌍을 처리하면서 순회하는 것이 유용할 수 있어요. 이럴 때는 maphash를 사용할 수 있어요:

(maphash #'(lambda (key value) (print (cons key value))) *hash-table*)

(각 키와 값을 cons 쌍으로 한 줄에 하나씩 출력해요.)

참고

(setf *hash-table* (make-hash-table))     ; => #<HASH-TABLE :TEST EQL :COUNT 0 {100375FD23}>
(gethash :foo *hash-table*)               ; => NIL
                                          ;    NIL
(gethash :foo *hash-table* 
         :default-value)                  ; => :DEFAULT-VALUE
                                          ;    NIL

(setf (gethash :foo *hash-table*) :bar)   ; => :BAR
(gethash :foo *hash-table*)               ; => :BAR
                                          ;    T

(setf (gethash :key *hash-table*) :value) ; => :RIGHT
(gethash :key *hash-table*)               ; => :VALUE
                                          ;    T

(remhash :key *hash-table*)               ; => T
(gethash :key *hash-table*)               ; => NIL
                                          ; => NIL
                            
(clrhash *hash-table*)                    ; => #<HASH-TABLE :TEST EQL :COUNT 0 {1005A90103}>
(gethash :foo *hash-table*)               ; => NIL
                                          ;    NIL
GitHub에서 편집 링크가 새 창이나 탭에서 열려요

해시 테이블 배우기

연습이 잠겨 있어요

해시 테이블 개념을 연습하려면 연습 문제 3개를 더 잠금 해제해요