forked from codeport/scala
-
Notifications
You must be signed in to change notification settings - Fork 0
17장 collections
nephilim edited this page Jan 28, 2012
·
5 revisions
시퀀스 타입은 정렬된 데이터를 보여준다.
- Lists
- 리스트의 head에서 아이템을 추가/삭제하는 것은 빠르다. -> pattern matching works well [Chapter 15]
- 불변성 -> 정확하고, 효율적인 알고리즘을 개발할 때 (리스트의 복사본을 만들 필요가 없기 때문에)
- 임의의 인덱스에 있는 아이템에 접근은 빠르지 않다. (인덱스에 접근하기 위해 리스트를 연속적으로 반복해야 하기 때문에)
-
Arrays
- 임의의 엘리먼트 접근 및 0기반의 인덱스로 엘리먼트를 얻거나 업데이트 하는 것이 쉽다.
- 스칼라의 배열은 Array(1,2,3), 자바의 배열은 Array[1,2,3]
- List buffers
- List에 엘리먼트를 추가하면 마지막에 reverse를 호출하게 된다. >> 이걸 피하는 방법으로 사용
- ListBuffer는 mutable object이며
- += append +=: prepend, 엘리먼트를 추가하고 toList를 호출하면 List가 생성된다.
- 스택오버플로우의 가능성을 제거한다.
- Array buffers
- 시퀀스의 시작과 끝에 엘리먼트 추가/삭제하는 것을 빼고 Array와 비슷하다.
- ArrayBuffer를 사용하기 위해서는 scala.collection.mutable.ArrayBuffer를 import한다.
-
Strings (via StringOps)
- String은 StringOps로 implicit conversion되어 StringOps의 메소드를 사용할 수 있다.
스칼라 collection에서는 immutable과 mutable한 Set/Map을 제공한다.
기본적으로 사용하는 Set/Map은 immutable이며 mutable을 사용하려면 명시적으로 import해야 한다.
immutable사용을 장려하는 차원으로, Predef에서 immutable을 쉽게 접근할 수 있도록 암시적으로 import했다.
object Predef {
type Map[A, +B] = collection.immutable.Map[A, B]
type Set[A] = collection.immutable.Set[A]
val Map = collection.immutable.Map
val Set = collection.immutable.Set
// ...
}
한 소스파일에서 immutable과 mutable을 같이 쓰고 싶으면 패키지 이름으로 import한다.
scala> import scala.collection.mutable
- Using sets
- Set은 키의 성질을 갖고 있어 동일한(==) 객체는 한 번밖에 저장되지 않는다.
- Using maps
- index가 0으로 시작하지 않는 것만 빼면 Array와 비슷하다.
- Map을 생성할 때는 key와 value의 타입을 지정해야 한다.
- Default sets and maps
- 엘리먼트의 수에 따라 구현하는 클래스가 달라진다.
- Sorted sets and maps
- 스칼라 라이브러리는 trait SortedSet과 trait SortedMap을 제공
- 이들을 구현한 TreeSet, TreeMap을 사용할 수 있다.
- 엘리먼트를 특정한 순서로 정렬해준다.
스칼라는 collection에서 immutable을 mutable로 바꾸기 쉽게 문법설탕을 제공한다.
collection을 생성하고 초기화하는 일반적인 방법
- companion object에 있는 팩토리메소드에 초기 엘리먼트를 전달한다.
scala> List(1,2,3)
res0: List[Int] = List(1, 2, 3)
scala> import scala.collection.mutable
import scala.collection.mutable
scala> val stuff = mutable.Set[Any](42)
stuff: scala.collection.mutable.Set[Any] = Set(42)
scala> stuff += "ab"
res1: stuff.type = Set(ab, 42)
서로 다른 타입을 가지는 collection을 만들고 싶을 때: 타입 [Any]를 명시한다.
scala> val num = List(1,2,3,4,5,6)
num: List[Int] = List(1, 2, 3, 4, 5, 6)
scala> val numSet = TreeSet(num)
<console>:12: error: No implicit Ordering defined for List[Int].
val numSet = TreeSet(num)
^
scala> val numSet = TreeSet[Int]() ++ num
numSet: scala.collection.immutable.TreeSet[Int] = TreeSet(1, 2, 3, 4, 5, 6)
scala> val st = mutable.Set[Any](1)
st: scala.collection.mutable.Set[Any] = Set(1)
scala> st += "a"
res2: st.type = Set(1, a)
scala> val sSet = Set[Any]() ++ st
sSet: scala.collection.immutable.Set[Any] = Set(1, a)
collection(1)으로 collection(2)을 초기화하고 싶을 때: collection(1)에 타입을 명시한다.
- Converting to array or list
- toList나 toArray로 List/Array로 변환할 수 있다.
- List나 Array로 변환할 때 collection의 엘리먼트를 복사하기 때문에 collection이 크면 느리다.
- Converting between mutable and immutable sets and maps
- empty메소드를 사용하여 collection을 생성하고 ++이나 ++=을 사용하여 엘리먼트를 추가한다.
- Array나 List와 달리 다른 타입의 오브젝트를 포함할 수 있다.
("String", 123, List(1,2,3))
- tuple은 다른 타입의 오브젝트를 포함하고 있기 때문에 Traversable을 상속하지 않는다.
- tuple의 엘리먼트는 ._위치(1부터 시작)로 접근할 수 있다.
- tuple의 엘리먼트는 할당할 수 있는데, ()를 빼면 tuple이 할당된다.
scala> ("String", 123, List(1,2,3))
res10: (java.lang.String, Int, List[Int]) = (String,123,List(1, 2, 3))
scala> val (a, b, c) = res10
a: java.lang.String = String
b: Int = 123
c: List[Int] = List(1, 2, 3)
scala> val d, e, f = res10
d: (java.lang.String, Int, List[Int]) = (String,123,List(1, 2, 3))
e: (java.lang.String, Int, List[Int]) = (String,123,List(1, 2, 3))
f: (java.lang.String, Int, List[Int]) = (String,123,List(1, 2, 3))
- 쓰기 쉽다.
- Scala Collection 기초
- Scala Collection 정리 문서
- The Scala 2.8 Collections API by Martin Ordersky, Lex Spoon