맵 : 그냥 해시맵이라 생각하자 하지만 clojure 세미나에서 보니 clojure의 해시맵은 꽤나 많은 고민을 하여 알고리즘을 선정하여 구현했다고 한다.
맵을 한 번 만들어 보자.
{}
끝. 이게 맵이다.
{:a "aaa" :b "bbb"}
여기서 :a는 키워드라고 하는데 키워드는 말그대로 키워드다.
{:더하기 +}
이러면 :더하기 라는 키워드(문자열아님)에 + 함수를 연결한 것이다.
{:a {:aa "숨겨진 값"}}
컬렉션 안에 컬렉션이 들어있는 느낌으로 감을 익혀라. (map안에 map이 있는 것)
map에서 값을 꺼내보자
(get {:A 1 :B 2} :A)
;=1
(get {:A 1 :B {:C "맵안에 맵!"}} :B)
;={:C "맵안에 맵!"}
감이 오는가? 많은 것을 배우려고 하지말자. 어떤 느낌인지 감을 느껴라. 리듬을 타라. 고개를 끄덕이며 '아 이런 느낌이군!' 감만 익혀라. 그러면 어떤 책이든 잡고 공부할 수 있다. (하지만 나도 공부하는 중이니 내 말은 듣지말도록...)
만약 값이 없다면?? (감이 있는 사람은 뭐가 나올지 알겠지.)
(get {:a "ㅎㅎㅎ"} :b)
;=nil
(get {:a "ㅎㅎㅎ"} :b "디폴트값 값이 없으면 이놈이 나오지")
;="디폴트값 값이 없으면 이놈이 나오지"
잠깐 그런게 맵.안.의.맵.의.값. 은 어떻게 가져오지?
(get (get {:A 1 :B {:C "날 뽑아낼 수 있을까?"}} :B) :C)
이걸 보는 순간 이제 리스프형의 프로그래밍이 어떻게 되는지 알 것이다. 반환하는 것을 감싸고 감싸고 감싸고.... 또 감싸다보면 상상하는 모든 일들이 벌어지는 것이다. 하지만 일단 코딩을 하기 전에 검색을 하는 버릇을 가지자. 저렇게 계속 get을 두번 사용하는 것보다 더욱 아름다워 보이는 방법이 있다.
(get-in {:A 1 :B {:C "날 뽑아낼 수 있을까?"}} [:B :C])
그리고 get이 없이 할 수도 있다.
(:C (:B {:A 1 :B {:C "날 뽑아낼 수 있을까?"}}))
왜 그런진 잘 모름. 키워드도 함수처럼 사용되는 느낌? 좀 더 내공이 쌓이면 완벽하게 이해를 할 수 있을지도...? 없을지도...
댓글 없음:
댓글 쓰기