Upload
samagu0030
View
888
Download
1
Embed Size (px)
Citation preview
클로저
나철환
클로저를 사용해야되는 이유
• 클로저는 우하하다
• Lisp의 특성을 가지고 있다.
• 함수형 언어이다.
• 병행 프로그래밍 간단히 만들수 있다.
• 자바를 포함한다.
클로저 – 우하하다
• Lisp 특성을 가지고 있다.
왜 Lisp인가?
• 매크로 – 개발자 자신의 목적대로 변형해서
사용할 수 있도록 만들어 주는 도구이다.
다른 언어에서는 private나 class의 의미가 정해져 있는데 Lisp는 매크로를 이
용해서 새로운 의미로 줄 수 있다.
private의 의미를 „단위 테스트와 직렬화의 경우에는 public이지만,
배포 시에는 private‟으로 의미를 바꿀 수 있다.
Lisp는 괄호로만 이루어져 있어서 간단하고
일관성이 있지만 초보자에게는 걸림돌이이
다.
클로저는 이런 어려움을 덜어 주기 위해서 몇
가지 방법을 사용하고 있다.
• 클로저는 리스트, 맵, 집합 등 다양한 자료
구조를 표현하기 위해 간단한 문법을 제공
한다.
• 예) 함수의 인자는 리스트 대신 벡터로 표
현 (즉, () 대신 []으로 표현한다)
• 쉼표를 공백으로 인식
• Lisp 경우 – (1 2 3)
• [1, 2, 3]
• 괄호를 꼭 필요한 곳에만 사용
클로저 - 함수형 언어
함수형 언어 특성
• 함수는 „일급 객체‟다. 즉, 함수가 실행 중에
생성되고, 인자를 넘겨지며, 반환될 수 있고,
다른 자료구조처럼 다뤄질 수 있다.
• 데이터 값은 변경 불가능하다.
• 함수들은 부수효과를 가지지 않는다.
과거에 함수형 언어들이 별다른 관심
을 얻지 못했는데 , 클로저는 왜 주목을
받는 것인가?
• 시기 – 멀티코어 하드웨어의 수가 대폭 늘
어나고 있고, 함수형 언어는 멀티코어에 이
점을 활용할 수 있는 명확한 방법을 제공
• 대부분 함수형 언어는 동적이지만 클로저
는 동적이기 때문에 배우고 접근하기 쉽다.
• 클로저는 자바 호출은 함수형 접근방식을
취하지 않는다.
클로저 – 병행 프로그래밍 간단히 만
들 수 있다.
• 함수형 언어이기 때문에 데이터를 변경하
는 것이 불가능하기 때문에 다른 스레드에
의해 데이터 변경되어 오류 나지 않는다.
• 또한 트랜잭션을 이용해서 어느 순서로 잠
궈야 할지 고민할 필요가 없게 된다.
클로저 – 자바를 포함한다.
• 클로저는 자바를 별도의 계층 없이 바로 호
출이 이루어 진다.
• 클로저는 자바를 편하게 호출하기 위해서
여러가지 문법 장치를 있다. (3장에서 자세
히~)
클로저 코딩 고고씽~
• “Hello World”
• (println “Hello World”)
• 출력값
• Hello World
• nil
함수를 하나 만들어 보자
• (defn hello [name] (str “Hello, “ name))
• 함수를 정의
• (defn hello [name] (str “Hello, “ name))
• 함수 이름
• (defn hello [name] (str “Hello, “ name))
• Hello는 name이라는 하나의 인자를 받는다.
• (defn hello [name] (str “Hello, “ name))
• Str은 여러 인자를 받아 하나의 문자열로 연
결하는 함수다.
• 반환 값
• #‟user/hello
• #은 이 함수가 크롤저 „ver‟에 저장 되었음
을 나타낸다.
• user은 이름공간이다.
• (자세한 것은 2장에서 )
함수 사용
(hello “Stu”)
출력
Hello, Stu
• 특별 변수
• 최근에 입력된 표현식 결과 3개를
• *1, *2, *3이라는 특별 변수에 저장
하고 있다.
• (hello “Stu”)
• 출력값 - “Hello, Stu”
• (hello “Clojure”)
• 출력값 – “Hello, Clojure”
• (str *1 “ and” *2)
• “Hello, Clojure and Hello, Stu”
공유 상태 추가하기
(이해를 못해서 죄송합니다.)
• 클로저 라이브러리
• require – 클로저 라이브러리 로드
• (require „examples.introdution)
• (take 8 „examples.introdution/fibs)
• 출력 (0 1 1 2 3 5 8 13)
• 피보나치 수열에 대한 구현 포함
• Refer – 현재 이름공간의 모든 이름을 새로
운 이른 공간으로 대응
• (refer „examples.introdution)
• (take 8 fibs)
• 출력 (0 1 1 2 3 5 8 13)
• use – refer 과 require 모두 사용가능
• (use „examples.introdution)
• (take 8 fibs)
• 출력 (0 1 1 2 3 5 8 13)
• (use :reload-all „examples.introdution)
• (take 8 fibs)
• 출력 (0 1 1 2 3 5 8 13)
끝