Search

Constructing collections

요소로부터 컬렉션 생성

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
복사
ArrayListLinkedList 와 같은 구체적인 타입의 컬렉션을 생성하려면 해당 타입에 대한 생성자를 사용할 수 있다.
SetMap 구현에도 유사한 생성자가 있다.

컬렉션 복사

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 을 생성한다.