잊지 않겠습니다.

Container

Array의 형태는 '[]'로 만들어준다.

a = [3.14, "pie", 99]

음수의 index의 경우에는 뒤에서부터 세는것이 가능하다.

shift,  pop이 모두 가능하다. 

Hash의 경우에는 '{}'로 만들어준다.

h = {'cat'=>'cats name', 'dog'=>'dogs name', 'count'=>10}

Block과 Iteritor

yield의 구현 : code block을 실행시켜주는 method.

sorce code에서는 block은 method 호출 바로 뒤에서만 나타나게 된다.

block안의 code는 나타나자마자 실행되지 않는다. 대신 Ruby가 block이 나타날 때의 상태를 기억하고 method로 들어가게 된다.

yield가 실행될 때마다, Block의 코드가 실행된다. : yield의 경우에는 Block의 code를 호출하고, 그 변수를 return 시켜주게 된다. 

def fix_up_to(max)
    i1, i2 = 1, 1
    while i1 <= max
       yield i1
       i1, i2 = i2, i1 + i2
    end
end

fix_up_to(1000) { |f| print f, " " }

: 실행순서 i1이 리턴된 후에 f로 들어가게 되어서, print f가 실행된 후에 다시 while 문으로 된다.

Block code의 경우에는 그 안에 있는 변수는 내부에서만 효용있는 변수가 된다.

 

 

Posted by Y2K
,
Class
  • 생성자 : initialize() 함수가 생성자로 만들어진다.
  • 모든  Class들은 열려져있는 상태를 유지하게 된다. 이미 정의된 CLass에서라도 언제든 원하는 메서드를 추가하는 것이 가능하다.
    • 같은 method를 다시 선언해서 치환하는 것이 가능하다.
  • super
    • 부모 Class에서의 선언되어있는 모든 것들을 의미한다.
    • Kasaoke < Song 의 경우에,  to_s의 부모 선언부를 알아보기 위해서는 다음과 같이 사용하면 된다.
    • 각 객체의 super class 를 순차적으로 찾아가면서 찾게 된다.
 class KaraokeSong < Song
    def to_s
        super + " [#@lyrics]"
    end
 end

Instance와 Property

C#에서의  property와  같은 접근법을 제공한다.(C# 3.0에서는 오히려 Ruby와 동일한 Class의 생성법들을 제공하고 있다.)

class Song
    attr_reader :name, :artisit, :duration
    attr_writer :name, :artist, :duration
end

위와 같은 코드에서는 자동적으로 @name, @artist, @duration과  Song.name, Song.artist, Song.duration의  읽고 쓰기가 가능한 Property가 생성이 된다.

Method와 속성과의 차이

: C#에서도 같은 이야기가 나온적이 있었고, 무언지 좋은지 나쁜지에 대한 토론이 자주 있었던것 같다. 그렇지만, 이에 대해서 확실한 것은 code의 가독성이라는 것에 대한 차이는 상당히 크다고 생각이 된다. 여러가지 코드를 볼때 언제나 값을 넣을 때, set, get의 Method만을 호출하는 것과, 자신의 Class의 값에 대해서는 Property를 이용해서 값을 넣고, 무언가 다른 class나 다른 resource에 값을 설정하고 저장할 때, 그에 대한 내용으로 set, get을 이용하는 것이 좀더 나은 방법으로 생각된다.

Class Variable & Class Method

:  생성된 모든 Class에서는 모두 instance를 가지게 된다.  Ruby에서 제공되는 Class Variable과 Class Method는 일반적으로 제공되는 Static Method와 Static Variable과 동일하게 생각하면 된다.


Class Variable

: '@@'로 정의된 변수를 의미한다. 모든 Class에서 공용으로 사용하게 된다.

Class Method

: 선언부로 instance메서드와 구분된다.

class Example
    def instance_method
    end
    def Example.class_method
    end
end
Singleton과 다른 생성자들

다음과 같은 코드를 이용해서 생성자로 생성을 못하고, 자신의 다른 생성자를 이용해서 instance를 생성시키는 것이 가능하다.

class MyLogger
    private_class_method :new
    @@logger = nil
    def MyLogger.create
        @@logger = new unless @@logger
        @@logger
    end
end
Class의 접근 제어 방법

Ruby에서는 모든 함수의 접근 제어 방법이 기본적으로 "public"으로 선언된다.

함수의 앞부분에 public, protected, private로 지정이 가능하다.

Class의 모든 단계에서 선언도 가능하다.

class MyClass
    public : method1, method4
    protected : method2
    private : method3

Posted by Y2K
,

XML 처리

Dynamic Language 2009. 1. 7. 13:11

XML의 처리 방법

  1. SAX (simple api for xml)
    1. Event 기반의 XML 처리 기법
  2. DOM (document object model)
    1. Object 기반의 XML 처리 기법
  3. XPath
  4. XSLT

  

XML 해석

  1. Parser가 XML 문서를 해석한 후, 응용프로그램에서 해석 결과를 가지고 이용한다.
  2. SAX에서는 XML 문서 구조에 대한 트리를 메모리에 생성하지 않고, 이벤트가 발생할 때마다 지정된 이름의 Callback이 이루어지게 된다.
    1. 문서를 순차적으로 읽으면서 발생
    2. 한가지 진행 방향으로만 참조가 가능
    3. 메모리의 사용량이 작다.
    4. 빠른 처리가 가능
    5. 노드의 추가나 노드의 이동 등 구조적인 변화를 주는 것은 불가능하다.
  3. DOM에서는 메모리 상에 문서 구조와 일치하는 객체 트리를 생성하고, 응용 프로그램은 API를 통해, 직접 참조하게 된다.
    1. 메모리의 부담이 증가
    2. SAX보다 처리시간이 많이 든다
    3. 전체 문서를 볼 수 있는 관점을 제공
    4. 임의의 노드 이동 및 수정, 추가가 자유롭다

  

XML 해석 - SAX

  1. 각각의 attribute에 대한 Handler를 작성해준다.
  2. Parser에서 handler를 등록해서, parsing을 시켜준다.
from xml.sax import make_parser, handler
import sys

class ProductHandler(handler.ContentHandler):
    def __init__(self, productName):
        self.productName = productName
        self.productList = []
        self.charActive = 0
        self.searchActive = 0
    def startElement(self, name, attrs):
        if name == 'product':
            if self.productName.lower() == attrs.get('name', '').lower():
                self.searchActive = 1
            else:
                self.searchActive = 0
        if not self.searchActive:
            return
        if name == 'vendor':
            self.vendor = attrs.get('name', 'unknown')
        elif name == 'price':
            self.model = attrs.get('model', 'unknown')
            self.priceStr = ''
            self.charActive = 1
    def endElement(self, name):
        if self.searchActive and name == 'price':
            self.productList.append( (self.vendor, self.model, int(self.priceStr) ) )
            self.charActive = 0
    def characters(self, content):
        if self.charActive:
            self.priceStr += content
    def endDocument(self):
        self.productList.sort(lambda a,b : cmp(a[2], b[2]))
        for product in self.productList:
            print '%-7s %6s %5s' % product

if __name__ == '__main__':
    h = ProductHandler(sys.argv[1])
    parser = make_parser()
    parser.setContentHandler(h)
    parser.parse('c:\python25\scripts\product.xml')

  

XML 해석 - DOM

  • DOM 구조는 모듈로 나누어진다. 각 모듈은 Domain을 나타낸다.
    • Core : 문서를 조작하고, 접근하여 사용하는 인터페이스 정의
    • XML : Core를 기반으로 처리 명령, CDATA, 엔티티와 같은 XML 1.0 정규 규정을 처리 할 수 있도록 설계
    • HTML : HTML 문서를 조작할 수 있는 인터페이스를 제공
    • Events: XML 트리 조작에 따른 이벤트와 마우스, 키보드나 HTML 관련 이벤트와 같은 사용자 이벤트를 정의한다.
    • Load/Save : XML 문서를 DOM Tree구조로 얻어오고, DOM 트리를 XML 문서로 저장하기 위한 연산 제공
    • Validation : DOM 트리에 대한 메소드 정의
    • XPath : DOM 트리를 검색하기 위한 편리하고 간편한 표현식을 사용 가능하게 한다.
    • Range : 문서의 영역을 저장하기 위한 기능
    • Traversal : DOM 트리를 검색하기 위한 메소드 제공
    • Views : 하나의 문서를 여러 형태로 볼 수 있게 하는 기능 제공
    • Style Sheets : 스타일 시트를 표현하기 위한 추상 인터페이스 제공
    • CSS : CSS 스타일 시트나 문서 서식을 다룰 편리하고 간편한 기능 제공

  

Posted by Y2K
,