본문 바로가기

프로그래밍/kotlin

컬렉션 : List, Set, Map

반응형

많은 언어와 달리, 코틀린은 변경 가능한 콜렉션과 변경 불가능한 콜렉션 (List, Set, Map 등)을 구별합니다. 컬렉션을 수정 할 수있는 정확한 시간을 제어하면 버그를 제거하고 좋은 API를 설계하는 데 유용합니다. 변경 가능 콜렉션의 읽기 전용 뷰 와 실제로 변경 불가능한 콜렉션 간의 차이점을 이해하는 것이 중요합니다 . 둘 다 쉽게 만들 수 있지만 타입 시스템은 차이를 표현하지 않으므로 관련성이있는 경우 해당 내용을 추적하는 것이 당신에게 달려 있습니다. 코틀린의 List<out T>타입은 size, get과 같은 읽기 전용 등의 작업을 제공하는 인터페이스입니다. 자바에서와 마찬가지로, Iterable<T>를 상속한 Collection<T>을 상속합니다. List을 변경하는 메소드는 MutableList<T>에 있습니다 . 이 패턴은 Set<out T>/MutableSet<T>과 유효 Map<out v>/MutableMap<K, V>에도 적용됩니다. List의 기본 사용법을 아래와 같이 설정할 수 있습니다.

val numbers: MutableList = mutableListOf(1, 2, 3)
val readOnlyView: List = numbers
println(numbers)        // prints "[1, 2, 3]"
numbers.add(4)
println(readOnlyView)   // prints "[1, 2, 3, 4]"
readOnlyView.clear()    // -> does not compile

val strings = hashSetOf("a", "b", "c", "c")
assert(strings.size == 3)
코틀린은 List 또는 Set를 생성하기위한 전용 구문 구조를 가지고 있지 않습니다. 표준 라이브러리의 메소드 (예 : listOf(),, mutableListOf()) setOf()를 사용하십시오. 성능이 중요하지 않은 코드에서는 간단한 이디엄 인  mapOf(a to b, c to d)를 사용해서 맵을 생성 할수 있습니다.. 참고로 이 readOnlyView같은 List과 기본 List 변경 등의 변화에 변수가 가리키는. List에 존재하는 유일한 참조가 읽기 전용이면 해당 컬렉션을 완전히 변경할 수 없다고 간주 할 수 있습니다. 이러한 컬렉션을 만드는 간단한 방법은 다음과 같습니다.
val items = listOf(1, 2, 3)
현재 listOf메소드는 배열리스트를 사용하여 구현되지만 미래에 메모리가 변경되지 않는 완전히 불변 인 콜렉션 타입이 반환 될 수 있으므로 변경이 불가능하다는 사실을 악용 할 수 있습니다. 읽기 전용 유형은 공변 입니다. 그 말은, List<Rectangle>에 List<Shape>할당할 수있다는 것을 의미합니다. 이는 실행시 실패를 허용하기 때문에 변경 가능한 콜렉션 타입에는 허용되지 않습니다. 때로는 변경하지 않을 특정 시점의 콜렉션 스냅 샷을 호출자에게 반환하려는 경우가 있습니다.
class Controller {
    private val _items = mutableListOf()
    val items: List get() = _items.toList()
}
toList확장 메서드는 따라서 반환 된 List을 변경하지 않을 보장, List 항목을 복제합니다. 익숙한 가치가있는 List 및 Set에는 다양한 유용한 확장 방법이 있습니다.
val items = listOf(1, 2, 3, 4)
items.first() == 1
items.last() == 4
items.filter { it % 2 == 0 }   // returns [2, 4]

val rwList = mutableListOf(1, 2, 3)
rwList.requireNoNulls()        // returns [1, 2, 3]
if (rwList.none { it > 6 }) println("No items above 6")  // prints "No items above 6"
val item = rwList.firstOrNull()
뿐만 아니라 정렬, 압축, 축소, 축소 등과 같은 모든 유틸리티를 기대할 수 있습니다. 지도는 동일한 패턴을 따릅니다. 다음과 같이 쉽게 인스턴스화하고 액세스 할 수 있습니다.
val readWriteMap = hashMapOf("foo" to 1, "bar" to 2)
println(readWriteMap["foo"])  // prints "1"
val snapshot: Map = HashMap(readWriteMap)



반응형

'프로그래밍 > kotlin' 카테고리의 다른 글

코틀린 - 함수  (0) 2021.04.18
코틀린 - 고차 함수와 람다  (0) 2021.04.18
코틀린 - 인라인 함수  (0) 2021.04.18
코틀린 - 코루틴  (0) 2021.04.18
코틀린 - 분리 선언  (0) 2021.04.18