Clojure Code Kata 1 - assoc

2022년 11월 01일

Clojure

# clojure# assoc# map# vector

📕 목차

이 글의 목적은 클로저의 숙련도를 높이기위해서 자주사용되는 core 함수 위주로 code kata를 함으로써 현업에서 클로저를 더 잘 쓰기 위함이다.

assoc

  • associate의 축약이다.
  • map에 적용되는 경우와, vector에 적용되는 경우가 다르다.
  • assoc 함수의 원형을 살펴보자.
    (assoc map key val) (assoc map key val & kvs)

map(맵)에서 assoc 사용하기

맵에 assoc 함수를 사용할 때는 먼저 함수 이름 뒤에 assoc하고자 하는 맵을 전달한 뒤 추가하고자 하는 키와 값을 지정하면 된다.

clojuredocs에 나와있는 예제와 함께 알아보도록 하겠다. 비어있는 맵에 새로운 키와 값을 추가하는 예제를 보여준다. 위의 함수 인터페이스에서 보듯이 & kvs 덕분에 여러 개의 키와 값을 계속해서 추가해줄 수 있다.

(assoc {} :key1 "value" :key2 "another value")
;; => {:key2 "another value", :key1 "value"}

assoc을 할 때 동일한 키를 사용한다면 어떠한 결과가 나올까?

(assoc {:key1 "old value1" :key2 "value2"}
        :key1 "new value1" :key3 "new value3")

위의 코드를 실행해보면 기존에 있던 :key1 이 new value1으로 바뀌고 새로운 키인 :key3 가 추가되어 새로운 맵이 반환되는 것을 볼 수 있다.

{:key3 "new value3" :key2 "value2" :key1 "new value1"}

nil을 사용하면 어떻게 될까?

(assoc nil :key1 4)
;;=> {:key1 4}

위의 코드에서 nil은 빈 맵으로 간주되어서 처리된다. key1이 새로 추가된 것을 확인할 수 있다.

vector(벡터)에서 assoc 사용하기

벡터에서 assoc을 사용한다면 key의 자리에 변경하고자 하는 인덱스를 지정해주고 val의 위치에 변경하고자 하는 값을 넣는다. 예시를 통해 살펴보자.

(assoc [1 2 3] 0 10)
;; [10 2 3]

위의 코드에서 기존에 [1 2 3] 이라는 벡터가 있었고 0번 Index자리의 값인 1을 10으로 바꾸는 것을 볼 수 있다.

벡터를 사용할 때 주의해서 봐야할 점은 인덱스의 범위를 초과하는지 여부다. 벡터를 사용할 때 다음과 같은 사항을 잘봐야한다. 여기서 사용되는 n은 벡터의 길이이다. (count vector)

  1. 0 < index ≤ n, 여기까지는 동작을 허용한다.
  2. n < index, 인 경우 java.lang.IndexOutOfBoundsException 에러가 발생한다.
;; 1번 케이스
;; 벡터의 길이가 3이고 인덱스가 3인 위치에 10의 값을 변경하려고 한다.
(assoc [1 2 3] 3 10)
;; => [1 2 3 10]

;; 2번 케이스
;; 벡터의 길이가 3인데 범위를 벗어나는 곳의 값을 변경하려고 한다.
(assoc [1 2 3] 4 10)
;; java.lang.IndexOutOfboundsException

참고자료

profile

박민기

단순하게 살아라. 현대인은 쓸데없는 절차와 일 때문에 얼마나 복잡한 삶을 살아가는가? - 이드리스 샤흐

© 2023, 미나리와 함께 만들었음