39
클로저 나철환

클로저 1

Embed Size (px)

Citation preview

Page 1: 클로저 1

클로저

나철환

Page 2: 클로저 1

클로저를 사용해야되는 이유

• 클로저는 우하하다

• Lisp의 특성을 가지고 있다.

• 함수형 언어이다.

• 병행 프로그래밍 간단히 만들수 있다.

• 자바를 포함한다.

Page 3: 클로저 1

클로저 – 우하하다

Page 4: 클로저 1
Page 5: 클로저 1
Page 6: 클로저 1

• Lisp 특성을 가지고 있다.

Page 7: 클로저 1

왜 Lisp인가?

Page 8: 클로저 1

• 매크로 – 개발자 자신의 목적대로 변형해서

사용할 수 있도록 만들어 주는 도구이다.

Page 9: 클로저 1

다른 언어에서는 private나 class의 의미가 정해져 있는데 Lisp는 매크로를 이

용해서 새로운 의미로 줄 수 있다.

private의 의미를 „단위 테스트와 직렬화의 경우에는 public이지만,

배포 시에는 private‟으로 의미를 바꿀 수 있다.

Page 10: 클로저 1

Lisp는 괄호로만 이루어져 있어서 간단하고

일관성이 있지만 초보자에게는 걸림돌이이

다.

클로저는 이런 어려움을 덜어 주기 위해서 몇

가지 방법을 사용하고 있다.

Page 11: 클로저 1

• 클로저는 리스트, 맵, 집합 등 다양한 자료

구조를 표현하기 위해 간단한 문법을 제공

한다.

• 예) 함수의 인자는 리스트 대신 벡터로 표

현 (즉, () 대신 []으로 표현한다)

Page 12: 클로저 1

• 쉼표를 공백으로 인식

• Lisp 경우 – (1 2 3)

• [1, 2, 3]

Page 13: 클로저 1

• 괄호를 꼭 필요한 곳에만 사용

Page 14: 클로저 1

클로저 - 함수형 언어

Page 15: 클로저 1

함수형 언어 특성

• 함수는 „일급 객체‟다. 즉, 함수가 실행 중에

생성되고, 인자를 넘겨지며, 반환될 수 있고,

다른 자료구조처럼 다뤄질 수 있다.

• 데이터 값은 변경 불가능하다.

• 함수들은 부수효과를 가지지 않는다.

Page 16: 클로저 1

과거에 함수형 언어들이 별다른 관심

을 얻지 못했는데 , 클로저는 왜 주목을

받는 것인가?

Page 17: 클로저 1

• 시기 – 멀티코어 하드웨어의 수가 대폭 늘

어나고 있고, 함수형 언어는 멀티코어에 이

점을 활용할 수 있는 명확한 방법을 제공

• 대부분 함수형 언어는 동적이지만 클로저

는 동적이기 때문에 배우고 접근하기 쉽다.

• 클로저는 자바 호출은 함수형 접근방식을

취하지 않는다.

Page 18: 클로저 1

클로저 – 병행 프로그래밍 간단히 만

들 수 있다.

Page 19: 클로저 1

• 함수형 언어이기 때문에 데이터를 변경하

는 것이 불가능하기 때문에 다른 스레드에

의해 데이터 변경되어 오류 나지 않는다.

• 또한 트랜잭션을 이용해서 어느 순서로 잠

궈야 할지 고민할 필요가 없게 된다.

Page 20: 클로저 1

클로저 – 자바를 포함한다.

Page 21: 클로저 1

• 클로저는 자바를 별도의 계층 없이 바로 호

출이 이루어 진다.

• 클로저는 자바를 편하게 호출하기 위해서

여러가지 문법 장치를 있다. (3장에서 자세

히~)

Page 22: 클로저 1

클로저 코딩 고고씽~

Page 23: 클로저 1

• “Hello World”

• (println “Hello World”)

• 출력값

• Hello World

• nil

Page 24: 클로저 1

함수를 하나 만들어 보자

Page 25: 클로저 1

• (defn hello [name] (str “Hello, “ name))

• 함수를 정의

Page 26: 클로저 1

• (defn hello [name] (str “Hello, “ name))

• 함수 이름

Page 27: 클로저 1

• (defn hello [name] (str “Hello, “ name))

• Hello는 name이라는 하나의 인자를 받는다.

Page 28: 클로저 1

• (defn hello [name] (str “Hello, “ name))

• Str은 여러 인자를 받아 하나의 문자열로 연

결하는 함수다.

Page 29: 클로저 1

• 반환 값

• #‟user/hello

• #은 이 함수가 크롤저 „ver‟에 저장 되었음

을 나타낸다.

• user은 이름공간이다.

• (자세한 것은 2장에서 )

Page 30: 클로저 1

함수 사용

(hello “Stu”)

출력

Hello, Stu

Page 31: 클로저 1

• 특별 변수

Page 32: 클로저 1

• 최근에 입력된 표현식 결과 3개를

• *1, *2, *3이라는 특별 변수에 저장

하고 있다.

Page 33: 클로저 1

• (hello “Stu”)

• 출력값 - “Hello, Stu”

• (hello “Clojure”)

• 출력값 – “Hello, Clojure”

• (str *1 “ and” *2)

• “Hello, Clojure and Hello, Stu”

Page 34: 클로저 1

공유 상태 추가하기

(이해를 못해서 죄송합니다.)

Page 35: 클로저 1

• 클로저 라이브러리

Page 36: 클로저 1

• require – 클로저 라이브러리 로드

• (require „examples.introdution)

• (take 8 „examples.introdution/fibs)

• 출력 (0 1 1 2 3 5 8 13)

• 피보나치 수열에 대한 구현 포함

Page 37: 클로저 1

• Refer – 현재 이름공간의 모든 이름을 새로

운 이른 공간으로 대응

• (refer „examples.introdution)

• (take 8 fibs)

• 출력 (0 1 1 2 3 5 8 13)

Page 38: 클로저 1

• 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)

Page 39: 클로저 1