SqueakByExample:10.2

From 흡혈양파의 번역工房
Revision as of 04:21, 17 August 2012 by Onionmixer (talk | contribs) (SBE 스트림VS컬렉션 페이지 추가)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

스트림 VS 컬렉션(Streams vs. collections)

컬렉션 프로토콜은 컬렉션의 구성요소들이 가진 저장소(the storage), 제거(removeal) 그리고 열거(enumeration)를 지원하지만, 이러한 연산들의 혼합을 허용하지는 않습니다. 예를 들면, 만약 OrderedCollection의 구성요소가 do: 메소드에 의해 처리되면, do: 블록 내부에 구성요소들을 추가하거나 제거하는 작업이 불가능해집니다. 컬렉션 프로토콜(the collection protocol)은, 어떤 컬렉션(collection)이 계속 앞으로 진행되고 어떤 컬렉션이 그렇지 않은지를 선택함으로써 동시에 2 개의 컬렉션을 반복적용(iterate)하기 위한 방법들을 제공하지 않습니다. 이러한 절차들(procedures)은 횡단 인덱스(traversal index) 또는 컬렉션 자체 외부에 유지되는 위치참조(position reference)를 요구합니다: 이것은 ReadStream, WriteStreamReadWriteStream의 정확한 역할입니다.

이 3개의 클래스는 동일한 컬렉션에서 스트림을 실행하기 위해 정의됩니다. 예를 들면, 다음 코드 조각은 인터벌(an interval)에 스트림(stream)을 만들고 2 개의 구성요소를 읽습니다.

r := ReadStream on: (1 to: 1000).
r next.        1
r next.        2
r atEnd.        false


WriteStream은 컬렉션(collection)에 데이터를 쓰기(writing) 할 수 있습니다.

w := WriteStream on: (String new: 5).
w nextPut: $a.
w nextPut: $b.
w contents.        'ab'


읽기 프로토콜(the reading protocol)과 쓰기 프로토콜(writing protocols) 모두를 지원하는 ReadWriteStreams를 만드는 것 또한 가능합니다.

WriteStream 와 ReadWriteStream의 주요 문제는, 스퀵에서 배열(arrays)과 문자열(Strings)만을 지원한다는 것입니다. 이 문제는 Nile로 작명된 새로운 라이브러리의 개발에 의해 변경되고 있는 중이지만, 현재 여러분이 다른 종류의 컬렉션에 스트림 실행을 시도하면, 에러를 보게 되실 것입니다:

w := WriteStream on: (OrderedCollection new: 20).
w nextPut: 12.        raises an error


스트림은 컬렉션 뿐만 아니라 파일 그리고 소켓(sockets)에도 사용될 수 있습니다. 다음 예시는 test.txt라 작명된 캐리지 리턴(carriage return)에 의해 분리된 파일을 만들고 그 파일에 문자열을 작성(쓰기)한 다음 그 파일을 닫습니다.

StandardFileStream
  fileNamed: 'test.txt'
  do: [:str | str
        nextPutAll: '123';
        cr;
        nextPutAll: 'abcd'].


다음 섹션들은 좀더 깊이 있게 프로토콜들을 제시합니다.

Notes