Clojure 도전기(동영상)

Clojure 도전기 002 - 사칙 연산, 자료형, 프로젝트 생성

여름나라겨울이야기 2015. 10. 30. 16:09
728x90





002 Clojure사칙연산자료형프로젝트 생성.emm


위에 첨부된 알마인드 마인드맵 파일은 2 개의 Tab 으로 구성되어있습니다.

1 번 탭은 방송에 맞는 Mini Version 이구요.

2 번 탭은 방송을 준비하면서 제가 고민했던 Max Version 입니다.


(get map key)

get 을 쓰기 위해서는 key 가 필요하다.

list 는 map 이 아님으로 get 을 써도 의미가 없다. nil 을 반납한다.

map: key 와 value 쌀들

vector: 위치를 key 로 하는 map

set: 값을 key 로 하는 map


(doc get)

-------------------------

clojure.core/get

([map key] [map key not-found])

  Returns the value mapped to key, not-found or nil if key not present.

nil


(nth coll index)

nth 는 순서가 있는 collection 이어야 쓸수 있다.


결국 순서가 없는 collection 인 map 과 set 을 쓸 수 없다.


(doc nth)

-------------------------

clojure.core/nth

([coll index] [coll index not-found])

  Returns the value at the index. get returns nil if index out of

  bounds, nth throws an exception unless not-found is supplied.  nth

  also works for strings, Java arrays, regex Matchers and Lists, and,

  in O(n) time, for sequences.

nil


Null (Nil) 이란 무엇인가?


Null 은 값이 없음을 뜻합니다. 예를 들어 보도록 하죠.


  • 출판하기 전 서적의 ISBN
  • 군대 가기 전 남자의 군번
  • 솔로들의 애인 성명

어느 시점에 그 값이 정해질 수도 있지만 영원히 안 정해질 수도 있죠. 

프로그램에서는 이렇게 정해지지 않을 값을 Null 이라고 합니다.

외계인(개발자)들이 아닌 경우 Empty 라고 표현하는 것이 더 이해하기 쉬울 것 같습니다.


키워드(: 으로 시작)를 함수로 사용하는 이유


Clojure 의 경우 소문자로 감싸여진 있는 Form 을 통해 함수를 실행하게 됩니다. 아래와 같은 형식이죠.


(함수 함수의인자1 함수의인자2 .. 함수의인자n)

Map 으로 부터 특정 값을 가져오는 form 을 만들어 보면


(get 맵 키워드) 

형태입니다.


keyword 를 함수로 사용하면 위의 form 을 간단하게 사용할 수 있게 됩니다.

(키워드 맵)


map 은 key 와 value 의 쌍들을 저장하고 있는 자료 구조입니다.

map 은 프로그래밍에서 아주 유용하게 쓰이게 되는 데요. 일반적인 업무에서 많이 쓰이는 표가 바로 map 형태이기 때문입니다.


Null(Nil) 과 Map 그리고 keyword 종합 예제



위와 같은 표가 있다고 했을 때 배경색이 핑크인 셀들이 바로 Null 인 경우입니다.


위 표에서 초보람보가 있는 행을 Map 으로 표현해 보면 아래과 같습니다.


{ :학번 3, :성명 "초보람보", :나이 17, :전공 "자바", :군번 "579", :대표서적 "자객" }


이 Map 을 쉽게 접근하기 위해 define 으로 novicerambo 라고 하는 symbol 로 참조할 수 있게 해보겠습니다.


(def novicerambo { :학번 3, :성명 "초보람보", :나이 17, :전공 "자바", :군번 "579", :대표서적 "자객" })


이 Map 에서 제가 원하는 나이 부분만 가져오겠다면 get 함수를 사용할 수 있습니다.


(get novicerambo :나이)


여기서 keyword 인 :나이를 함수로 사용할 수 있기 때문에 바로 위 식을 짧게 아래와 같이 고쳐 쑬 수 있습니다.


(:나이 novicerambo)


결론적으로 (get novicerambo :나이) 라고 써야하는 것을 (:나이 novicerambo) 로 줄여서 쓸 수 있다는 것인데, 개발자들은 이렇게 타이핑이 들어드는 것을 무척 선호하는 경향이 있습니다. 그리고 앞으로 공부하게 되면서 키워드를 함수로 사용함으로 인해 많은 이득을 얻게 되는 경우를 보게 될 겁니다.


참고(지금은 잘 몰라도 되지만): 위의 표 전체는 Map 들의 Vector 로 표시할 수 있습니다.


[

{ :학번 1, :성명 "Toby", :나이 25, :전공 "스프링", :군번 "123", :대표서적 "토비의 스프링" }

{ :학번 2, :성명 "Kevin", :나이 24, :전공 "스칼라", :군번 "345", :대표서적 nil }

{ :학번 3, :성명 "초보람보", :나이 17, :전공 "자바", :군번 "579", :대표서적 "자객" }

{ :학번 4, :성명 "김지영", :나이 23, :전공 "주차달인", :군번 nil, :대표서적 nil }

]


위의 구조에서 성명만 갖고 오고 싶을 때는 map 이라는 함수를 사용하는데요. 여기서는 예제만 보이고 추후에 알아 보도록 하겠습니다.


(def table

[

{ :학번 1, :성명 "Toby", :나이 25, :전공 "스프링", :군번 "123", :대표서적 "토비의 스프링" }

{ :학번 2, :성명 "Kevin", :나이 24, :전공 "스칼라", :군번 "345", :대표서적 nil }

{ :학번 3, :성명 "초보람보", :나이 17, :전공 "자바", :군번 "579", :대표서적 "자객" }

{ :학번 4, :성명 "김지영", :나이 23, :전공 "주차달인", :군번 nil, :대표서적 nil }

]

)


(map :전공 table)


(map :군번 table)


(filter #(> (:나이 %) 23) table)


(filter #(= (:나이 %) 23) table)


(filter #(< (:나이 %) 23) table)




반응형