3. 자바와 사용하기



     아키텍트를 꿈꾸는 사람들
              양창선
Contents
 시작 하며
 장점
 문법
자바를 몰라요
 정의가 틀리고 횡설수설할 가능성 농후
 이해 못해 넘어가는 부분도 다수
 발표가 아니라 역으로 가르쳐 주셔야 할지도..
 그래서 문법보다 정의위주로 합니다.
  다 읽어 오셔서 아실 꺼라 믿습니다.
     나름 열심히 공부는 했어요




                       http://cafe.naver.com/happyzzx.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=9700
클로저의 자바 지원은 매우 강력
 Lisp의 표현력과 자바에 특화된 편리한 문법을
  동시에 취할 수 있다는 점에서 강력하다.
 자바와 자바 라이브러리를 포용 해서 강력하다.
클로저의 자바 지원은 매우 간결
 상호 작용에 군더더기가 없어 간결하다.
 바이트 코드로 컴파일이 되며 별도의 계층을 거
  치지 않는다.
 자바코드를 LIsp로 감싸지 않고 바로 접근 할 수
  있다.
클로저의 자바 호출
 클래스, 인스턴스, 생성자, 메서드, 필드 등
 어떤 자바 코드에도 접근할 수 있다.
  간편한 문법을 제공
 자바 코드를 직접 호출하거나, 자바 API를 함수
 형 스타일로 감싸서 사용하는 것도 가능 하다.
자바 코드 접근
 클래스
 인스턴스
 생성자
 메서드
 필드
 간편한 문법
자바 코드 접근
 클래스
 인스턴스
 생성자


 (def rnd (new java.util.Random))
자바 코드 접근
 메서드   (.rnd nextInt 10)
 필드    (. Math PI)
 간편한 문법
클로저의 속도
 자바 가상 머신에서 돌아가는 다른 동적 언어와
달리 „빠르다‟.
  배열이나 원시타입(primitives), 타입 힌트 등 으로 자바
  컴파일러가 생성한 것과 똑같은 코드를 만들 수 있다.
클로저의 속도
 배열
 원시타입
 타입힌트
클로저의 속도
 (make-arry String 5)                                 // 직접선언
 (int-array 5)                                        // 원시타입
 (to-array [ “AA” “BB” “CC” ])                        // 가변길이
 (into-array String [ “AA” “BB” “CC” ])               // 명시적타입
 (def somestrings (into-array [“some" “string“ “here”]))
   (seq (amap somestrings idx _ (.toUpperCase (aget strings idx))))
   => ( “SOME” “STRING” “HERE” )           // expr이 적용된 배열을 반환한다.

    타입을 명시적 선언하면 자바와 똑같은 코드를 만들어 내기 때문에 속도가 빠르다.
클로저의 자바 클래스 생성
 자바 코드에서 클로저 코드 호출 가능
 클로저에서 실행 중 동적으로 자바 클래스 생성
 가능
  proxy나 gen-and-save-class를 통해
클로저의 자바 클래스 생성
 proxy(프록시)
   자바와의 상호작용을 위해 자바 인터페이스를 구현
    하는 경우 필요
    SAX(Simple API for XML ) 파서를 가지고 XML 파싱 하기가 좋은 예다.
        먼저 필요한 클래스를 import 합니다.
         o (import „(org.xml.sax InputSource)
                    „(org.xml.sax.helpers DefaultHandler)
                    „(java.io StringReader)
                    „(javax.xml.parsers SAXParserFactory))
클로저의 자바 클래스 생성
 SAX(Simple API for XML ) 파서를 가지고 XML 파싱 하기

    proxy를 이용해 startElement에 대한 모든 호출 내용을 출력하는 DefaultHandler를 생
     성하는 예
    (def print-element-handler
          proxy [DefaultHandler]      // 수퍼클래스나 구현할 인터페이스들의 벡터
          []                                        // 기본 클래스 생성자에 넘겨질 인자들의 벡터
          (startElement               // 프록시 메서드구현(Defaulthandler은 하나 가지고 있다)
           [uri local qname atts]     // 네 개의 인자를 받는다, qname 이름을 출력
           (println (format “Saw element: %s” qname)))))


    만들어짂 핸들러를 파서에 넘겨주자.
클로저의 자바 클래스 생성
 SAX(Simple API for XML ) 파서를 가지고 XML 파싱 하기


    REPL에서 간단히 문자열로 XML을 파싱하는 함수를 만들자
        (defn demo-sax-parse [source handler]
          (.. SAXParserFactory newinstance newSAXParser
          (parse (InputSource. (StringReader. source))
          handler)))
클로저의 자바 클래스 생성
 SAX(Simple API for XML ) 파서를 가지고 XML 파싱 하기




       파싱 실행
           (demo-sax-parse “<foo>
            <bar>Body of bar</bar>
            </foo>” print-element-handler)
            | Saw element: foo
            | Saw element: bar
   자바의 XML 인터페이스를 다루는 클로저 프록시를 만드는 과정이 간단하다는 것을
    보여준다
클로저의 예외 처리
 사용이 매우 쉽다
 기본 단위는 자바와 완전히 같다.
 with-open 같은 상용구를 이용한다.
  예외 검사와 자원 관리 등의 번거로운 일을 줄인다.
 try와 throw 만으로도 자바의
  try,catch,finally,throw를 대체 할 수 있다.
 검사되는 예외를 꼭 처리하지 않아도 된다.
클로저의 예외 처리
 자바의 예외 처리
   try{
      newManifest = new Manifest® ;
    } catch (IOException e) {
       throw new BuildException(…);
    }

 클로저에서는 검사되는 예외를 처리 하지 않아도
 된다.
   (Manifest. r)
클로저의 예외 처리
 가비지 컬렉션(garbage collection)은 메모리에 있는 자원 해제 한다.
   파일 핸들같은 메모리 바깥에 있는 자원은 스스로 해제를 해야 한다.
   자바는 보통 finally 부분에서 한다.
   해제 자원에 close 메서드가 있다면, 클로저의 with-open 매크로를 이용
   할 수 있다.
    spit은 문자열을 파일에 쓰는 함수
        ex) (clojure.contrib.duck-streams/spit file content)
             • (use „[clojure.contrib.duck-streams :only (spit)])
               (spit “hello.out” “hello, world”)


    clojure-contrib에서 spit 함수의 구현 내용
        (defn spit [f content]                               // f에 대한 printWriter 객체 생성
          (with-open [#^PrintWriter w (writer f)]             // with-open은 writer 닫는 것 보장
          (.print w content)))                                // writer에 대한 content 출력
Lancet을 앤트 프로젝트와 테스크에
적용




       http://blog.naver.com/hsjhp?Redirect=Log&logNo=10007634263
자바와 같이 일하기
 정리
  클로저는 자바를 직접 호출 할 수 있다.
  자바 클래스를 만들거나 인터페이스 구현 가능
  클로저는 실용성을 기초로 한다
    자바 코드를 잘 쓰자
    하지만 자바 컬렉션 API는 상대적으로 쓰지말자.
     시퀀스 라이브러리가 더 강력하고 스레드 세이프하다
끝




http://cafe.naver.com/likecomics.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=5469

Clojure/Chapter3

  • 1.
    3. 자바와 사용하기 아키텍트를 꿈꾸는 사람들 양창선
  • 2.
  • 3.
    자바를 몰라요  정의가틀리고 횡설수설할 가능성 농후  이해 못해 넘어가는 부분도 다수  발표가 아니라 역으로 가르쳐 주셔야 할지도..  그래서 문법보다 정의위주로 합니다.  다 읽어 오셔서 아실 꺼라 믿습니다.  나름 열심히 공부는 했어요 http://cafe.naver.com/happyzzx.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=9700
  • 4.
    클로저의 자바 지원은매우 강력  Lisp의 표현력과 자바에 특화된 편리한 문법을 동시에 취할 수 있다는 점에서 강력하다.  자바와 자바 라이브러리를 포용 해서 강력하다.
  • 5.
    클로저의 자바 지원은매우 간결  상호 작용에 군더더기가 없어 간결하다.  바이트 코드로 컴파일이 되며 별도의 계층을 거 치지 않는다.  자바코드를 LIsp로 감싸지 않고 바로 접근 할 수 있다.
  • 6.
    클로저의 자바 호출 클래스, 인스턴스, 생성자, 메서드, 필드 등 어떤 자바 코드에도 접근할 수 있다.  간편한 문법을 제공  자바 코드를 직접 호출하거나, 자바 API를 함수 형 스타일로 감싸서 사용하는 것도 가능 하다.
  • 7.
    자바 코드 접근 클래스  인스턴스  생성자  메서드  필드  간편한 문법
  • 8.
    자바 코드 접근 클래스  인스턴스  생성자  (def rnd (new java.util.Random))
  • 9.
    자바 코드 접근 메서드 (.rnd nextInt 10)  필드 (. Math PI)  간편한 문법
  • 10.
    클로저의 속도  자바가상 머신에서 돌아가는 다른 동적 언어와 달리 „빠르다‟.  배열이나 원시타입(primitives), 타입 힌트 등 으로 자바 컴파일러가 생성한 것과 똑같은 코드를 만들 수 있다.
  • 11.
    클로저의 속도  배열 원시타입  타입힌트
  • 12.
    클로저의 속도  (make-arryString 5) // 직접선언  (int-array 5) // 원시타입  (to-array [ “AA” “BB” “CC” ]) // 가변길이  (into-array String [ “AA” “BB” “CC” ]) // 명시적타입  (def somestrings (into-array [“some" “string“ “here”])) (seq (amap somestrings idx _ (.toUpperCase (aget strings idx)))) => ( “SOME” “STRING” “HERE” ) // expr이 적용된 배열을 반환한다.  타입을 명시적 선언하면 자바와 똑같은 코드를 만들어 내기 때문에 속도가 빠르다.
  • 13.
    클로저의 자바 클래스생성  자바 코드에서 클로저 코드 호출 가능  클로저에서 실행 중 동적으로 자바 클래스 생성 가능  proxy나 gen-and-save-class를 통해
  • 14.
    클로저의 자바 클래스생성  proxy(프록시)  자바와의 상호작용을 위해 자바 인터페이스를 구현 하는 경우 필요  SAX(Simple API for XML ) 파서를 가지고 XML 파싱 하기가 좋은 예다.  먼저 필요한 클래스를 import 합니다. o (import „(org.xml.sax InputSource) „(org.xml.sax.helpers DefaultHandler) „(java.io StringReader) „(javax.xml.parsers SAXParserFactory))
  • 15.
    클로저의 자바 클래스생성  SAX(Simple API for XML ) 파서를 가지고 XML 파싱 하기  proxy를 이용해 startElement에 대한 모든 호출 내용을 출력하는 DefaultHandler를 생 성하는 예  (def print-element-handler proxy [DefaultHandler] // 수퍼클래스나 구현할 인터페이스들의 벡터 [] // 기본 클래스 생성자에 넘겨질 인자들의 벡터 (startElement // 프록시 메서드구현(Defaulthandler은 하나 가지고 있다) [uri local qname atts] // 네 개의 인자를 받는다, qname 이름을 출력 (println (format “Saw element: %s” qname)))))  만들어짂 핸들러를 파서에 넘겨주자.
  • 16.
    클로저의 자바 클래스생성  SAX(Simple API for XML ) 파서를 가지고 XML 파싱 하기  REPL에서 간단히 문자열로 XML을 파싱하는 함수를 만들자  (defn demo-sax-parse [source handler] (.. SAXParserFactory newinstance newSAXParser (parse (InputSource. (StringReader. source)) handler)))
  • 17.
    클로저의 자바 클래스생성  SAX(Simple API for XML ) 파서를 가지고 XML 파싱 하기  파싱 실행  (demo-sax-parse “<foo> <bar>Body of bar</bar> </foo>” print-element-handler) | Saw element: foo | Saw element: bar  자바의 XML 인터페이스를 다루는 클로저 프록시를 만드는 과정이 간단하다는 것을 보여준다
  • 18.
    클로저의 예외 처리 사용이 매우 쉽다  기본 단위는 자바와 완전히 같다.  with-open 같은 상용구를 이용한다.  예외 검사와 자원 관리 등의 번거로운 일을 줄인다.  try와 throw 만으로도 자바의 try,catch,finally,throw를 대체 할 수 있다.  검사되는 예외를 꼭 처리하지 않아도 된다.
  • 19.
    클로저의 예외 처리 자바의 예외 처리  try{ newManifest = new Manifest® ; } catch (IOException e) { throw new BuildException(…); }  클로저에서는 검사되는 예외를 처리 하지 않아도 된다.  (Manifest. r)
  • 20.
    클로저의 예외 처리 가비지 컬렉션(garbage collection)은 메모리에 있는 자원 해제 한다.  파일 핸들같은 메모리 바깥에 있는 자원은 스스로 해제를 해야 한다.  자바는 보통 finally 부분에서 한다.  해제 자원에 close 메서드가 있다면, 클로저의 with-open 매크로를 이용 할 수 있다.  spit은 문자열을 파일에 쓰는 함수  ex) (clojure.contrib.duck-streams/spit file content) • (use „[clojure.contrib.duck-streams :only (spit)]) (spit “hello.out” “hello, world”)  clojure-contrib에서 spit 함수의 구현 내용  (defn spit [f content] // f에 대한 printWriter 객체 생성 (with-open [#^PrintWriter w (writer f)] // with-open은 writer 닫는 것 보장 (.print w content))) // writer에 대한 content 출력
  • 21.
    Lancet을 앤트 프로젝트와테스크에 적용 http://blog.naver.com/hsjhp?Redirect=Log&logNo=10007634263
  • 22.
    자바와 같이 일하기 정리  클로저는 자바를 직접 호출 할 수 있다.  자바 클래스를 만들거나 인터페이스 구현 가능  클로저는 실용성을 기초로 한다  자바 코드를 잘 쓰자  하지만 자바 컬렉션 API는 상대적으로 쓰지말자. 시퀀스 라이브러리가 더 강력하고 스레드 세이프하다
  • 23.