-
Kotlin Collection - 1. 컬렉션 생성Kotlin 2021. 10. 11. 12:06
코틀린의 컬렉션은 자바의 컬렉션과 구조상 매우 흡사합니다.
Iterable을 상속받는 Collection이 있고 그걸 다시 상속받는 List와 Set, 그리고 별도로 Map이 존재하는 구조입니다. 단, 자바와 다른점은 Mutable이 별도로 구분되있다는 점입니다. 즉, Mutable은 변경가능한 컬렉션을 말하고, Mutable이 붙지않은 컬렉션은 변경이 불가능한 것을 말합니다. 이렇게 기본적인 타입으로 Mutable과 Immutable을 구분한 것은 멀티 스레딩 환경에서 Thread-Safe하게 컬렉션을 다루기 위해서라고 예상됩니다.
오늘은 코틀린 컬렉션의 생성 방법에 대해서 알아보겠습니다.
생성자 및 사용법
- List
val readOnlyList = listOf("a", "b", "cde") val mutableList = mutableListOf<String>("123", "456") val emptyList = emptyList<String>() //readOnlyList.add("d") mutableList.add("d")
List는 다음과 같이 listOf(), mutableListOf()라는 함수로 생성할 수 있습니다. 단, listOf로 생성할 시 Read-Only한 List입니다. 따라서 주석처리한 것처럼 새로운 원소를 삽입할 수 없습니다.
코틀린의 타입추론이라는 특성에 의해 List를 생성할 때, 따로 타입을 명시해주지 않아도 어떤 타입의 List인지 자동으로 타입이 정해집니다.
코틀린에서는 빈 리스트를 생성할 때 emptyList()라는 함수를 사용해서 생성해줄 수 있는데요, 이럴경우는 타입 추론이 되지 않아 타입을 명시해줘야합니다.
- Set
val readOnlySet = setOf("a", "b", "cde") val mutableSet = mutableSetOf<String>("123", "456") val emptySet = emptySet<String>() mutableSet.add("d")
Set 역시, List와 생성 방법에서 거의 동일합니다. setOf() 또는 mutableSetOf()라는 함수를 사용해서 Set을 생성할 수 있습니다. 단 코틀린에서는 기본적으로 LinkedHashSet으로 구현되있습니다. 따라서, Set을 초기화할 때 원소를 명시하거나 삽입한 순서대로 원소의 순서가 정해집니다.
- Map
val readOnlyMap = mapOf(0 to "0", 1 to "1", 2 to "2") val mutableMap = mutableMapOf<Int, String>(3 to "3", 4 to "4") val mutableMap2 = mutableMapOf<Int, String>().apply { this[0] = "0"; this[1] = "1" } val emptyMap = emptyMap<Int, String>()
Map 또한 mapOf()와 mutableMapOf()로 초기화 할 수 있습니다. 공식 문서에 의하면, to는 짧은 시간동안 Pair 객체를 만들기 때문에 성능이 떨어질 수 있다고 합니다. 따라서, 성능이 중요하다면 3번째처럼 mutableMap을 만들고 apply를 통해 객체를 초기화하는 방법을 추천한다고 합니다.
- 여러값을 동시에 초기화
List를 사용하다보면 한번에 여러값을 초기화시켜야할 때가 있습니다. 이럴때 일일이 명시하는 것은 실수하기도 쉽고 번거로운 일입니다. 코틀린에서는 특수한 생성자를 통해 초깃값을 한번에 초기화시킬 수가 있습니다.
val multipleInitList = List<Int>(10, {it * 2}) println(multipleInitList)
위의 코드처럼 생성할 숫자를 명시하고, 두번째 인자로 어떤 값으로 초기화할지 함수를 넘겨주면 해당 값으로 초기화할 수 있습니다. 람다의 인자는 List의 index입니다. 이 코드를 실행시켜보면,
다음과 같이 index * 2의 값으로 초기화됐음을 알 수 있습니다.
참고 자료
'Kotlin' 카테고리의 다른 글
Kotlin Collection - 3.Sequences (0) 2021.10.24 Kotlin Collection - 2.Transformation Operation(map, zip, flatten) (0) 2021.10.17 Const val과 val의 차이 (0) 2021.09.03 Kotlin의 고차 함수 (0) 2021.05.23 Kotlin의 Null 처리 (0) 2021.05.17