요소로부터 컬렉션 생성
val numbersSet = setOf("one", "two", "three", "four")
val emptySet = mutableSetOf<String>()
Kotlin
복사
•
가장 일반적인 방법은 표준 라이브러리 함수인 listOf<T>(), setOf<T>(), mutableListOf<T>(), mutableSetOf<T>()를 사용하는 것이다.
•
쉼표로 구분된 컬렉션 요소를 인수로 제공하면 컴파일러가 요소의 타입을 자동으로 감지한다.
•
빈 컬렉션을 만들 때는 타입을 명시적으로 지정해야 한다.
val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key4" to 1)
Kotlin
복사
•
Map도 mapOf() 와 mutableMapOf() 함수를 사용하여 생성할 수 있다.
•
Map의 Key와 Value는 Pair 객체로 전달된다. (to 중위 함수로 생성됨)
val numbersMap = mutableMapOf<String, String>().apply {
this["one"] = "1"
this["two"] = "2"
}
Kotlin
복사
•
to 표기법은 짧은 수명주기를 가진 Pair 객체를 생성하므로 성능이 중요하지 않은 경우에만 사용하는 것이 좋다.
•
메모리 사용량을 줄이기 위해 쓰기 작업을 사용하여 mutableMap 을 생성하고 채우는 대안이 있다.
컬렉션 빌더 함수로 생성
val map = buildMap {
put("a", 1)
put("b", 0)
put("c", 4)
}
println(map) // {a=1, b=0, c=4}
Kotlin
복사
•
컬렉션을 생성하는 또 다른 방법은 빌더 함수인 buildList(), buildSet(), buildMap() 을 호출하는 것이다.
•
이 함수들은 해당 타입의 새로운 mutable 컬렉션을 생성한 후 쓰기 작업을 사용하여 채우고 동일한 요소를 가진 읽기 전용 컬렉션을 반환한다.
빈 컬렉션 생성
val empty = emptyList<String>()
Kotlin
복사
•
요소가 없는 컬렉션을 생성하는 함수로는 emptyList(), emptySet(), emptyMap() 이 있다.
•
빈 컬렉션을 만들 때는 해당 컬렉션이 포함할 요소의 타입을 지정해야 한다.
리스트의 초기화 함수
val doubled = List(3, { it * 2 }) // or MutableList
println(doubled)
Kotlin
복사
•
리스트의 경우 리스트 크기와 각 요소의 값을 인덱스에 기반하여 정의하는 초기화 함수와 유사한 생성자가 있다.
구체적인 타입 생성자
val linkedList = LinkedList<String>(listOf("one", "two", "three"))
val presizedSet = HashSet<Int>(32)
Kotlin
복사
•
ArrayList 나 LinkedList 와 같은 구체적인 타입의 컬렉션을 생성하려면 해당 타입에 대한 생성자를 사용할 수 있다.
•
Set 과 Map 구현에도 유사한 생성자가 있다.
컬렉션 복사
val alice = Person("Alice")
val sourceList = mutableListOf(alice, Person("Bob"))
val copyList = sourceList.toList()
sourceList.add(Person("Charles"))
alice.name = "Alicia"
println("First item's name is: ${sourceList[0].name} in source and ${copyList[0].name} in copy")
// First item's name is: Alicia in source and Alicia in copy
println("List size is: ${sourceList.size} in source and ${copyList.size} in copy")
// List size is: 3 in source and 2 in copy
Kotlin
복사
•
기존 컬렉션과 동일한 요소를 가진 컬렉션을 생성하려면 복사 함수들을 사용할 수 있다.
•
표준 라이브러리의 컬렉션 복사 함수들은 얕은 복사 컬렉션을 생성하며 동일한 요소에 대한 참조를 가진다.
•
따라서 컬렉션 요소를 변경하면 모든 복사본에 반영된다.
val sourceList = mutableListOf(1, 2, 3)
val copySet = sourceList.toMutableSet()
copySet.add(3)
copySet.add(4)
println(copySet)
// [1, 2, 3, 4]
Kotlin
복사
•
컬렉션을 다른 타입으로 변환할 수도 있다.
•
예를 들어 List 에서 Set 을 만들거나 그 반대도 가능하다.
val sourceList = mutableListOf(1, 2, 3)
val referenceList = sourceList
referenceList.add(4)
println("Source size: ${sourceList.size}")
// Source size: 4
Kotlin
복사
•
동일한 컬렉션 인스턴스에 대한 새로운 참조도 만들 수 있다.
•
컬렉션 변수를 기존 컬렉션으로 초기화하면 새로운 참조가 생성된다.
•
참조를 통해 컬렉션 인스턴스를 변경하면 모든 참조에 변경 사항이 반영된다.
val sourceList = mutableListOf(1, 2, 3)
val referenceList: List<Int> = sourceList
//referenceList.add(4) //컴파일 오류 발생
sourceList.add(4)
println(referenceList) // sourceList의 현재 상태를 출력
// [1, 2, 3, 4]
Kotlin
복사
•
컬렉션 초기화는 변경 가능성을 제한하는데 사용할 수 있다.
•
예를 들어 MutableList 를 가리키는 List 참조를 생성하면 이 참조를 통해 컬렉션을 수정하려고 하면 컴파일러가 오류를 발생시킨다.
다른 컬렉션에서 함수 호출하기
val numbers = listOf("one", "two", "three", "four")
val longerThan3 = numbers.filter { it.length > 3 }
println(longerThan3)
// [three, four]
Kotlin
복사
•
컬렉션은 다른 컬렉션에 대한 다양한 연산의 결과로 생성될 수 있다.
•
예를 들어 List 를 필터링하면 필터 조건에 맞는 요소들로 이루어진 새로운 List 가 생성된다.
val numbers = setOf(1, 2, 3)
println(numbers.map { it * 3 })
// [3, 6, 9]
println(numbers.mapIndexed { idx, value -> value * idx })
// [0, 2, 6]
Kotlin
복사
•
map 은 변환의 결과로 List 를 생성한다.
val numbers = listOf("one", "two", "three", "four")
println(numbers.associateWith { it.length })
// {one=3, two=3, three=5, four=4}
Kotlin
복사
•
associateWith 은 Map 을 생성한다.