SqueakByExample:10.2: Difference between revisions

From 흡혈양파의 번역工房
Jump to navigation Jump to search
(SBE 스트림VS컬렉션 페이지 추가)
 
(번역수정)
(One intermediate revision by the same user not shown)
Line 1: Line 1:
==스트림 VS 컬렉션(Streams vs. collections)==
==Stream 대 collection==


컬렉션 프로토콜은 컬렉션의 구성요소들이 가진 저장소(the storage), 제거(removeal) 그리고 열거(enumeration)를 지원하지만, 이러한 연산들의 혼합을 허용하지는 않습니다. 예를 들면, 만약 OrderedCollection의 구성요소가 do: 메소드에 의해 처리되면, do: 블록 내부에 구성요소들을 추가하거나 제거하는 작업이 불가능해집니다. 컬렉션 프로토콜(the collection protocol)은, 어떤 컬렉션(collection)이 계속 앞으로 진행되고 어떤 컬렉션이 그렇지 않은지를 선택함으로써 동시에 2 개의 컬렉션을 반복적용(iterate)하기 위한 방법들을 제공하지 않습니다. 이러한 절차들(procedures)은 횡단 인덱스(traversal index) 또는 컬렉션 자체 외부에 유지되는 위치참조(position reference)를 요구합니다: 이것은 '''ReadStream''', '''WriteStream''' 과 '''ReadWriteStream'''의 정확한 역할입니다.  
컬렉션 프로토콜은 컬렉션의 요소에 대한 저장<sup>storage</sup>, 제거<sup>removal</sup> 그리고 열거형<sup>enumeration</sup>등의 작업을 지원하지만, 이러한 연산들을 혼합하는걸 허용하지는 않습니다. 예를 들어, 만약 OrderedCollection 의 구성요소가 do: 메소드를 이용해서 처리하는경우, do: 블록 내부에서 요소의 추가 또는 제거 작업은 불가능합니다. 그리고 컬렉션 프로토콜은, 컬렉션을 선택하며 선택된 컬렉션은 계속 진행하고 선택되지 않은 컬렉션은 진행을 멈추는 작업처럼, 동시에 2 개의 컬렉션을 반복 적용하기 위한 방법들을 제공하지 않습니다. 컬렉션 프로토콜은, 어떤 컬렉션이 계속 앞으로 진행되고 어떤 컬렉션이 그렇지 않은지를 선택함으로써 동시에 2 개의 컬렉션을 반복 적용하기 위한 방법들을 제공하지 않습니다. 이런 작업을 하고싶다면 컬렉션 내부의 index 또는 위치에 대한 참조를 콜렉션의 외부에서 관리할 필요가 있습니다: '''ReadStream''', '''WriteStream''' 과 '''ReadWriteStream''' 은 정확히 이런경우에 사용할 수 있습니다.
 
바로 위에서 언급한 3 가지 클래스는 컬렉션을 stream 처리하기위해 만들어졌습니다. 예를들어 아래의 코드는 interval 에 stream 을 만들고 2 개의 요소를 읽어들입니다.


이 3개의 클래스는 동일한 컬렉션에서 스트림을 실행하기 위해 정의됩니다. 예를 들면, 다음 코드 조각은 인터벌(an interval)에 스트림(stream)을 만들고 2 개의 구성요소를 읽습니다.
<syntaxhighlight lang="smalltalk">
<syntaxhighlight lang="smalltalk">
r := ReadStream on: (1 to: 1000).
r := ReadStream on: (1 to: 1000).
Line 12: Line 13:




WriteStream은 컬렉션(collection)에 데이터를 쓰기(writing) 할 수 있습니다.  
WriteStream 은 컬렉션에 데이터를 쓰기<sup>write</sup> 할 수 있습니다.  
 
<syntaxhighlight lang="smalltalk">
<syntaxhighlight lang="smalltalk">
w := WriteStream on: (String new: 5).
w := WriteStream on: (String new: 5).
Line 21: Line 23:




읽기 프로토콜(the reading protocol)과 쓰기 프로토콜(writing protocols) 모두를 지원하는 ReadWriteStreams를 만드는 것 또한 가능합니다.  
읽기<sup>read</sup> 프로토콜과 쓰기<sup>write</sup> 프로토콜 양쪽을 지원하는 ReadWriteStreams 를 만드는 것도 가능합니다.  
 
WriteStream 와 ReadWriteStream 의 주요 문제는, 스퀵의 경우 array 와 string 을 지원한다는 것입니다. 이 문제는 Nile 이라는 이름의 새로운 라이브러리를 개발함으로서 개선을 진행중입니다만, 현시점에서는 다른 종류의 컬렉션에 stream 처리를 시도한다면, 에러가 납니다:


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




스트림은 컬렉션 뿐만 아니라 파일 그리고 소켓(sockets)에도 사용될 수 있습니다. 다음 예시는 test.txt라 작명된 캐리지 리턴(carriage return)에 의해 분리된 파일을 만들고 그 파일에 문자열을 작성(쓰기)한 다음 그 파일을 닫습니다.  
stream 은 컬렉션 뿐만 아니라 파일 그리고 소켓(network)에도 사용할 수 있습니다. 아래의 예제에서는 test.txt 라 작명된 캐리지 리턴으로 분리된 파일을 만들고 그 파일에 문자열을 작성한 다음 그 파일을 닫고 있습니다.
 
<syntaxhighlight lang="smalltalk">
<syntaxhighlight lang="smalltalk">
StandardFileStream
StandardFileStream
Line 41: Line 45:




다음 섹션들은 좀더 깊이 있게 프로토콜들을 제시합니다.
다음장에서는 이런 프로토콜들을 좀 더 심도있게 알아보겠습니다.
 
 


==Notes==
==Notes==

Revision as of 04:20, 14 September 2013

Stream 대 collection

컬렉션 프로토콜은 컬렉션의 요소에 대한 저장storage, 제거removal 그리고 열거형enumeration등의 작업을 지원하지만, 이러한 연산들을 혼합하는걸 허용하지는 않습니다. 예를 들어, 만약 OrderedCollection 의 구성요소가 do: 메소드를 이용해서 처리하는경우, do: 블록 내부에서 요소의 추가 또는 제거 작업은 불가능합니다. 그리고 컬렉션 프로토콜은, 컬렉션을 선택하며 선택된 컬렉션은 계속 진행하고 선택되지 않은 컬렉션은 진행을 멈추는 작업처럼, 동시에 2 개의 컬렉션을 반복 적용하기 위한 방법들을 제공하지 않습니다. 컬렉션 프로토콜은, 어떤 컬렉션이 계속 앞으로 진행되고 어떤 컬렉션이 그렇지 않은지를 선택함으로써 동시에 2 개의 컬렉션을 반복 적용하기 위한 방법들을 제공하지 않습니다. 이런 작업을 하고싶다면 컬렉션 내부의 index 또는 위치에 대한 참조를 콜렉션의 외부에서 관리할 필요가 있습니다: ReadStream, WriteStreamReadWriteStream 은 정확히 이런경우에 사용할 수 있습니다.

바로 위에서 언급한 3 가지 클래스는 컬렉션을 stream 처리하기위해 만들어졌습니다. 예를들어 아래의 코드는 interval 에 stream 을 만들고 2 개의 요소를 읽어들입니다.

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


WriteStream 은 컬렉션에 데이터를 쓰기write 할 수 있습니다.

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


읽기read 프로토콜과 쓰기write 프로토콜 양쪽을 지원하는 ReadWriteStreams 를 만드는 것도 가능합니다.

WriteStream 와 ReadWriteStream 의 주요 문제는, 스퀵의 경우 array 와 string 을 지원한다는 것입니다. 이 문제는 Nile 이라는 이름의 새로운 라이브러리를 개발함으로서 개선을 진행중입니다만, 현시점에서는 다른 종류의 컬렉션에 stream 처리를 시도한다면, 에러가 납니다:

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


stream 은 컬렉션 뿐만 아니라 파일 그리고 소켓(network)에도 사용할 수 있습니다. 아래의 예제에서는 test.txt 라 작명된 캐리지 리턴으로 분리된 파일을 만들고 그 파일에 문자열을 작성한 다음 그 파일을 닫고 있습니다.

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


다음장에서는 이런 프로토콜들을 좀 더 심도있게 알아보겠습니다.


Notes