반응형
원문: Scala Collections API - Trait Traversable
Trait Traversable
컬렉션 계층 구조의 최상단에는 trait Traversable이 존재합니다. 이 trait이 가지는 추상 함수는 foreach가 유일합니다.
def foreach[U](f: Elem => U)
Traversable 을 구현하는 컬렉션 클래스는 이 메서드만 정의하면 됩니다. 다른 모든 메서드는 Traversable 에서 상속받을 수 있습니다.
foreach 메서드는 컬렉션의 모든 요소를 탐색하고, 주어진 연산인 f 를 각 요소에 적용하도록 설계되었습니다. 연산 f의 타입은 Elem => U 이며, 여기서 Elem 은 컬렉션 요소의 타입이고 U 는 임의의 결과 타입입니다. f 의 호출은 오직 부수 효과(side effect)를를 위해서만 수행되며, 실제로 f 를 통해 얻은 결과는 foreach 에 의해 버려집니다.
Traversable 은 다음 표에 나열된 수많은 구체적인 메서드를 정의합니다. 이러한 메서드들은 다음 범주로 분류됩니다.
- 덧셈(Addiction, ++)은 두 traversable 객체를 하나로 합치거나, iterator 의 모든 요소를 Traversable 에 추가합니다.
- Map 연산인 map, flatMap, collect 는 컬렉션 요소에 함수를 적용하여 새로운 컬렉션을 생성하는 연산입니다.
- 변환 연산(Conversion operation)인 toArray, toList, toIterable, toSeq, toIndexedSeq, toStream, toSet, toMap과 같은 메서드들은 Traversable 컬렉션을 더 구체적인 타입으로 변환합니다. 이 변환 메서드들은 컬렉션의 런타임 타입이 이미 요구하는 컬렉션 타입과 일치하는 경우 수신자(receiver) 인수를 변경하지 않고 그대로 반환합니다. 예를 들어, List 에 toList 를 적용하면 그 List 자체가 반환됩니다.
- 복사 연산(Copying operation) copyToBuffer 와 copyToArray. 그 이름에서 알 수 있듯이 컬렉션의 요소들을 각각 버퍼(buffer) 또는 배열(array)로 복사합니다.
- 크기 정보 연산(Size info operation) isEmpty, nonEmpty, size, hasDefiniteSize. Traversable 컬렉션은 유한하거나 무한할 수 있습니다. 예를 들어, 무한한 Traversable 컬렉션의 한 예시는 Stream.from(0) 와 같은 자연수 스트림입니다. hasDefiniteSize 메서드는 컬렉션이 무한할 가능성이 있는지를 나타냅니다. hasDefiniteSize 함수가 true 를 반환하면, 해당 컬렉션은 확실히 유한합니다. false 를 반환하면, 컬렉션이 아직 완전히 명확하게 정의되지 않은 상태이므로 무한할 수도 있고 유한할 수도 있습니다.
- 요소 검색 연산(Element retrieval operation) head, last, headOption, lastOption, find. 이 함수들은 첫 번째 또는 마지막 요소를 선택하거나, 조건에 일치하는 첫 번째 요소를 찾는 연산입니다. 하지만 모든 컬렉션이 "첫 번째"와 "마지막"이라는 의미를 명확하게 정의하는 것은 아닙니다. 예를 들어, HashSet은 해시 키에 따라 요소를 저장할 수 있는데, 이 해시 키는 실행할 때마다 달라질 수 있습니다. 이 경우, HashSet 의 "첫 번째" 요소 또한 프로그램이 실행될 때 마다 달라질 수 있습니다. 컬렉션이 항상 동일한 순서로 요소를 반환한다면 그 컬렉션은 정렬되어 있다고 합니다. 대부분의 컬렉션은 정렬되어 있지만, 일부(예: HashSet)는 정렬을 포기하여 약간의 효율성을 얻었습니다. 정렬은 재현 가능한 테스트와 디버깅에 필수적인 경우가 많습니다. 그래서 Scala 컬렉션은 모든 컬렉션 타입에 대해 정렬된 대안을 제공합니다. 예를 들어, HashSet 의 정렬된 대안으로 LinkedHashSet 을 제공합니다.
- 하위 컬렉션 검색 연산(Sub-collection retrieval operation) tail, init, slice, take, drop, takeWhile, dropWhile, filter, filterNot, withFilter. 이 메서드들은 모두 특정 조건에 따라 식별되는 하위 컬렉션을 반환하는 연산입니다.
- 분할 연산(Subdivision operation) splitAt, span, partition, groupBy. 이 메서드들은 컬렉션의 요소들을 여러 하위 컬렉션으로 분할하는 연산입니다.
- 요소 검사(Element test) exists, forall, count. 이 메서드들은 주어진 조건자(predicate)를 사용하여 컬렉션의 요소들을 검사하는 연산입니다.
- Fold 연산 foldLeft, foldRight, /:, :\, reduceLeft, reduceRight 은 이진 연산(binary operation)을 연속적인 요소들에 적용하는 연산입니다.
- 특정 fold 연산 sum, product, min, max 는 특정 타입(숫자형 또는 비교 가능한 타입)의 컬렉션에서 동작하는 연산입니다.
- 문자열 연산(string operation) mkString, oddString, stringPrefix는 컬렉션을 문자열로 변환하는 다양한 방법을 제공하는 연산입니다.
- View 연산은 두 가지 오버로드된 형태의 view 메서드로 제공됩니다. View 는 지연 평가되는 컬렉션입니다. View 에 대해서는 다른 곳에서 더 자세히 배우게 될 것입니다.
Traversable class에 정의된 연산들
형태 | 동작 |
추상 메서드(Abstract Method): | |
xs foreach f | 함수 f 를 xs 의 모든 요소에 적용합니다. |
덧셈(Addiction): | |
xs ++ ys | xs 와 ys 의 모든 요소를 하나로 합칩니다. ys 는 TraversableOnce 컬렉션인 Traversable 또는 Iterator 여야 합니다. |
Maps: | |
xs map f | 함수 f 를 xs 의 모든 요소에 적용하여 새로운 컬렉션을 만듭니다. |
xs flatMap f | 컬렉션을 반환하는 함수 f 를 xs 의 모든 요소에 적용하여 그 결과를 모두 이어붙인 새로운 컬렉션을 만듭니다. |
xs collect f | 부분 함수 f 를 xs 의 모든 요소에 적용하여 부분 함수(partial function)에 정의된 결과만을 모아 새로운 컬렉션을 만듭니다. |
변환(Conversions): | |
xs.toArray | 컬렉션을 array로 변환합니다. |
xs.toList | 컬렉션을 list로 변환합니다. |
xs.toIterable | 컬렉션을 iterable로 변환합니다. |
xs.toSeq | 컬렉션을 sequence로 변환합니다. |
xs.toIndexedSeq | 컬렉션을 indexed sequence로 변환합니다. |
xs.toStream | 컬렉션을 지연 평가되는 stream으로 변환합니다. |
xs.toSet | 컬렉션을 set으로 변환합니다. |
xs.toMap | key/value 형태의 pair를 map으로 변환합니다. 만약 컬렉션이 pair 타입으로 이루어져 있지 않다면 static type error가 발생합니다. |
복사(Copying): | |
xs copyToBuffer buf | 컬렉션의 모든 요소를 버퍼 buf 로 복사합니다. |
xs copyToArray(arr, s, n) | 컬렉션에서 최대 n 개의 요소를 배열 arr의 시작 인덱스 s 위치부터 시작해서 복사해줍니다. 마지막 두 요소는 optional 입니다. |
크기 정보(Size info): | |
xs.isEmpty | 컬렉션이 비어있나 검사합니다. |
xs.nonEmpty | 컬렉션이 비어있지 않은지 검사합니다. |
xs.size | 컬렉션 요소의 갯수를 반환합니다. |
xs.hasDefiniteSize | xs 가 유한한 크기를 가졌다면 true 를 반환합니다. |
요소 검색(Element Retrieval): | |
xs.head | 컬렉션의 첫 번째 요소(순서가 없다면 임의의 요소)를 반환합니다. |
xs.headOption | xs 가 비어있다면 None, 그렇지 않다면 첫 번째 요소를 Option 컨테이너에 담아 반환합니다. |
xs.last | 컬렉션의 마지막 요소(순서가 없다면 임의의 요소)를 반환합니다. |
xs.lastOption | xs 가 비어있다면 None, 그렇지 않다면 마지막 요소를 Option 컨테이너에 담아 반환합니다. |
xs find p | p 연산을 만족하는 첫 번째 요소를 Option 컨테이너에 담아 반환합니다. 만족하는 요소가 없으면 None 입니다. |
하위 컬렉션(Subcollections): | |
xs.tail | xs.head를 제외한 나머지 요소들이 포함된 컬렉션을 반환합니다. |
xs.init | xs.last를 제외한 나머지 요소들이 포함된 컬렉션을 반환합니다. |
xs slice (from, to) | 특정 인덱스 범위 xs(from 을 포함하고 to 를 포함하지 않습니다)에 해당하는 요소들이 포함된 컬렉션을 반환합니다. |
xs take n | 첫 n개 요소들이 포함된 컬렉션을 반환합니다(만약 순서가 없다면 임의의 n개를 포함합니다). |
xs drop n | xs take n 이외의 요소들이 포함된 컬렉션을 반환합니다. |
xs takeWhile p | 첫 인덱스부터 시작해서 p 조건을 만족하지 않을때까지 평가하여 조건을 만족하는 요소들만 포함된 컬렉션을 반환합니다. |
xs dropWhile p | 첫 인덱스부터 시작해서 p 조건을 만족할 때까지 평가하여 조건을 만족하지 않는 요소들만 포함된 컬렉션을 반환합니다. |
xs filter p | p 조건을 만족하는 요소들만 포함된 컬렉션을 반환합니다. |
xs withFilter p | 컬렉션에 대한 엄격하지 않은(non-strict) 필터입니다. 이후에 호출되는 map, flatMap, foreach, withFilter 는 조건 p가 참인 xs의 요소에만 적용됩니다. |
xs filterNot p | p 조건을 만족하지 않는 요소들만 포함된 컬렉션을 반환합니다. |
분할(Subdivisions): | |
xs splitAt n | 특정 위치에서 xs 를 분할해서 컬렉션 쌍 형태인 (xs take n, xs drop n) 을 반환합니다 |
xs span p | xs 를 조건에 따라 분할해서 컬렉션 쌍 형태인 (xs takeWhile p, xs dropWhile p) 를 반환합니다. |
xs partition p | xs 를 컬렉션 쌍으로 분할합니다. 하나는 조건 p 를 만족하는 요소들을 포함하고, 하나는 만족하지 않는 요소들만 포함하여 컬렉션 쌍 형태인 (xs filter p, xs filterNot p) 를 반환합니다. |
xs groupBy f | 결정 함수(discriminator function)인 f 를 xs 의 요소들에 적용하여 Map 타입으로 만듭니다. |
요소 검사(Element tests): | |
xs forall p | xs 의 모든 요소가 조건 p 를 만족하는지 boolean 타입으로 반환합니다. |
xs exists p | xs 의 요소 중 하나라도 조건 p 를 만족하는지 boolean 타입으로 반환합니다. |
xs count p | 조건 p 를 만족하는 xs 의 요소의 갯수를 반환합니다. |
Folds: | |
(z /: xs)(op) | xs 의 연속적인 요소들 사이에 이진 연산 op 를 적용하되, 왼쪽에서 오른쪽으로 진행하며 z 로 시작합니다. |
(xs :\ z)(op) | xs 의 연속적인 요소들 사이에 이진 연산 op 를 적용하되, 오른쪽에서 왼쪽으로 진행하며 z 로 시작합니다. |
xs.foldLeft(z)(op) | (z /: xs)(op)와 동일합니다. |
xs.foldRight(z)(op) | (xs :\ z)(op)와 동일합니다. |
xs reduceLeft op | 비어있지 않은 컬렉션 xs 의 연속적인 요소들 사이에 이진 연산 op 를 왼쪽에서 오른쪽으로 적용합니다. |
xs reduceRight op | 비어있지 않은 컬렉션 xs 의 연속적인 요소들 사이에 이진 연산 op 를 오른쪽에서 왼쪽으로 적용합니다. |
Specific folds: | |
xs.sum | 숫자 요소들로 이루어진 컬렉션 xs의 모든 요소들을 더합니다. |
xs.product | 숫자 요소들로 이루어진 컬렉션 xs의 모든 요소들을 곱합니다. |
xs.min | 순서가 있는 요소들로 이루어진 컬렉션 xs의 최소를 구합니다. |
xs.max | 순서가 있는 요소들로 이루어진 컬렉션 xs의 최대를 구합니다. |
문자열: | |
xs addString (b, start, sep, end) | StringBuilder b 에 xs 의 모든 요소를 구분자(separators) sep 사이에 넣고, 시작(start)과 끝(end) 문자열로 감싸서 표시하는 문자열을 추가합니다. start, sep, end 는 모두 optional 입니다. |
xs mkString (start, sep, end) | 컬렉션 xs 의 모든 요소를 구분자(separators) sep 사이에 넣고, 시작(start)과 끝(end) 문자열로 감싸서 표시하는 문자열로 변환합니다. start, sep, end 는 모두 optional 입니다. |
xs.stringPrefix | xs.toString으로부터 반환되는 문자열의 시작 부분에 있는 컬렉션의 이름입니다. |
Views: | |
xs.view | xs 로부터 view 를 만듭니다. |
xs.view(from, to) | xs 로부터 범위(from 을 포함하고 to 를 포함하지 않습니다) 내의 요소들로 새로운 view 를 만듭니다. |
반응형