Clojure 배우기
경고 : 제목에 대해서 딴지 걸지 마시오!!!
추신 1 : 사실 외계어는 '외계어 스터디'를 통해 JavaScript를 배웠으나 다 까먹었고, 토비님께 Java를 배우던 중 너무 기초 지식이 부족하여 헤드 어쩌고 SQL 도서(경쟁사 책이라 도서명을 다 올리지 않음)를 독학했음.
왜 Clojure인지, 어쩌다가 외계어 프로젝트가 시작되었는지, 앞으로 어떤 외계어를 배울 것인지는 다음 두 개의 영상 1, 2를 통해 확인해보기 바람.
Clojure를 배우기 위해 처음에는 이것저것 설치를 하였다. 외계어를 배우는 데 있어서 설치가 반이라고 하더니... 첫날 첫 수업은 프로그램 설치를 하다가 끝났다. 나는 케빈 언니의 도움으로 brew라는 것을 설치했는데, 설치 과정은 따로 영상을 녹화해 두었으니 차후 정리가 되는대로 공유하도록 하겠다. 어쨌든, 나는 brew를 설치했고 에디터로는 Sublime Text2를 사용하기로 했으며(clojure를 작성하기 위해 REPL을 업데이트했음) 이름도 어려운 leiningen을(이건 왜 했더라???) 설치하였다.
Clojure를 본격적으로 배운 두 번째 수업부터의 내용을 정리해 보겠다. 모든 수업은 Code Coast TV의 김종민님의 강의로 진행되며 두 번째 수업의 영상은 다음에서 확인할 수 있다.
• 연산자가 숫자 사이에 들어가는 것이 아니고 제일 앞에 들어간다.
• nil (다른 언어의 null과 같다.)
• “ “으로 감싸 있으면 문자가 하나 들어가 있어도 문자열이다.
• \가 붙어 있으면 하나의 문자이다.
• Clojure에는 변수가 없다.
• list를 표시하기 위해서는 ( ) 앞에 ‘을 넣던가 (list …)로 표기한다. —> 순서가 있는 목록이다.
• list는 값만 있기 때문에 get을 사용할 수 없다.
• map은 key와 value를 가지고 있다. —> 순서가 없다.
• vector는 위치를 key로 한다. —> 대괄호 안에… : 순서가 있다
• set은 값을 key로 한다. —> 순서가 없다. 중복된 값을 무시한다.
Q 사칙연산을 배우는 과정에서 class는 무엇인지 확인을 왜 하는 건가요?
A C 언어 이후의 언어 C++, JAVA, C# 개발자들은 습관적으로 내가 쓰고 있는 데이터의 분류(Class - 자료형)가 무엇인지 궁금해하거든요. 자료형에 따라 값이 넘치거나 하는 문제가 있어서요.
Q Long과 Double이 타입을 정의하는 것이라고 하셨는데, 어떤 타입을 정의하는 것인가요? 왜 Clojure에서는 신경 쓰지 않아도 되는 거죠?
A 정수를 저장하는 자료형(Class)에는 여러 종류가 있는데 각각 저장할 수 있는 숫자의 범위가 달라요.
마치 우리가 컵을 살 때 200cc, 500cc, 1000cc 하는 것처럼요. 이 컵들을 찬장에 넣는다고 생각해 보세요. 무조건 작으면 많이는 들어가지만 큰 용량이 필요할 때 쓸 컵이 없는 것과 같고, 큰 용량의 컵만 사서 넣는다면 찬장을 금방 채워 버리고 말겠죠. 기존 프로그래밍 언어는 찬장의 크기(메모리 사용량)등을 프로그래머가 일일이 신경 써 주어야 했는데 클로저의 경우에는 알아서 필요한 용량의 컵을 사용하기 때문에 신경 쓸 필요가 없는 거죠.
추가 답변 : 리스프를 처음 배우는 분들에게는 굳이 처음부터 말할 필요는 없다고 생각합니다. 리스프는 좀 더 추상화된 스칼라 데이터 타입을 가지고 있으니까요. 따라서 김지영님은 그냥 못 들은 걸로 하시면 됩니다.
Q nil(null)이란 값은 무얼 말하는 것이고 그걸 표시하는 이유는 무엇인가요?
A nil(null) 은 값이 없음을 뜻합니다. 김실장님이 이해하시기 좋은 예는 아마도 "출판하기 전 서적의 ISBN"이라고 생각하시면 될 듯합니다.
추가 질문 : nil은 그러면 empty라는 뜻이라고 하셨는데, 비었다는 것인가요? 없다는 것인가요? 어차피 없는 건데 왜 nil(null)이라는 표기가 필요한 거죠? 그냥 오류가 나는 것이 아닌가요???
추가 답변 : nil(null)은 표기가 아니라 nil 또는 null이라는 의미로 쓰셨을 것 같아요. 보통 nil 또는 null은 없다, 아니다, 비었다, 끝이다는 의미로 다양하게 쓰이고요. clojure에서 nil은 비었다는 의미 보다는 없다는 쪽에 가까운 것 같습니다.
추가적인 설명을 위해 김종민님과 박성철님이 댓글로 대화하신 내용을 추가한다.
김종민 : 지금 현재 나우 값을 특정할 수 없을 때 null을 사용합니다.
과거나 미래에 값을 특정하게 되면 null 대신 특정한 값을 갖게 되는 거죠. 영원히 없을 수도.. 뽕뽕이가 허 총재를 인용해서 김실장님 애인은 영원히 null이라고... 후다닥 도맹!!!
박성철 : 그러면 어떤 값이 null인 상태에서 나중에 다른 값으로 변경할 수 있다는 얘기인가요? null일 때는 불변성이 보장되지 않는다는 의미?
김종민 : 아.. 소크라테스의 문답법 느낌입니다. ^^;
null 자체는 불변이겠지만 null을 참조하고 있던 변수는 다른 시간에는 다른 것을 참조할 수 있겠죠.
박성철 아! clojure는 순수 한수형이 아니라 변수가 있나 보군요.
김종민 박성철 너무 깊이 들어가십니다.
(def 심벌 값) 형태가 있는데요. 여기서 심벌은 참조 변수로 보시면 될 것 같습니다. 심벌은 내부적으로 Var 랑 연결이 되고 Var 가 값과 매핑이 되고, 심벌은 Var를 참조하는 형식입니다.
이 부분이 저도 좀 난해하기는 한데요. Clojure에서는 값을 변경할 수는 없다고 합니다.
(def a 1) ' a 가 1을 가지고 있는 Var를 참조한다.
(def a 2) ' a 가 2를 가지고 있는 Var를 참조한다.
이렇다고 하네요. immutable이라고 하는데 이 경우도 immutable이라는 Clojure 의 이야기는 아직 다 이해를 못하고 있습니다. ^^;
Q 키워드를 함수로 사용할 수 있다. —> 그렇게 사용하는 이유는 무엇인가요???
A keyword를 함수로 사용하면 프로그램을 더 짧고 이해하기 쉬운 코드로 만들 수 있습니다.
Min 버전 설명이었고요. Max 버전은 제 블로그에... 질문에 대한 답변은 노란색 배경만 보시면 될 것 같습니다.
http://expert0226.tistory.com/327
추신 2 : 외계어를 전혀 모르는 상태에서 배웠어야 하는데 그래도 '외계어스터디'를 통해 JavaScript를 조금 배우고 자바와 SQL 책을 한번 읽은 것만으로 완전 쌩초보라고 하기에는 어설프게 아는 부분이 있는 것 같아서 오히려 더 어려운 듯한 느낌도 든다.