Collection / MutableCollection
kotlin.collection.Collection
인터페이스이다.
// 읽기만 지원
interface Collection<out E> : Iterable<E>
// 읽기/쓰기 지원
interface MutableCollection<E> : Collection<E>, MutableIterable<E>
List / MutableList
kotlin.collection.Collection
인터페이스를 상속 받고 있다.
// 읽기만 지원
interface List<out E> : Collection<E>
// 읽기/쓰기 지원
interface MutableList<E> : List<E>, MutableCollection<E>
Map & MutableMap
Key
와 Value
를 쌍으로 데이터를 저장한다.
// 읽기만 지원
interface Map<K, out V>
// 요소의 추가 및 삭제 처리를 제공
interface MutableMap<K, V> : Map<K, V>
fun main() {
var map = mapOf("RED" to "#FF0000", "GREEN" to "#008000", "BLUE" to "#0000FF")
println(map["Red"])
for ((key, value) in map) {
println("$key = $value")
}
}
// #FF0000
// RED = #FF0000
// GREEN = #008000
// BLUE = #0000FF
Set & MutableSet
List
와 비슷하지만 중복값을 허용하지 않으며 순서가 없다.
// 읽기만 지원
interface Set<out E> : Collection<E>
// 요소의 추가 및 삭제 처리를 제공
interface MutableSet<E> : Set<E>, MutableCollection<E>
fun main() {
var color = mutableSetOf("RED", "GREEN", "BLUE")
color.add("RED")
println(color)
}
// [RED, GREEN, BLUE]
Array / List
Array
배열(Array
)은 정적인 데이터 타입으로 선언하는 순간 크기가 정해지며 이후 크기를 수정할 수 없으며 배열의 값(value)에 인덱스(Index)를 이용해 접근하고 수정할 수 있다.
val arr1 = arrayOf<Int>(1, 2, 3, 4, 5) // [1, 2, 3, 4, 5]
val arr2 = arrayOfNulls<Int>(3) // [null, null, null]
val arr3 = Array<Int>(5) { 0 } // [0, 0, 0, 0, 0]
List
리스트(List
)는 동적인 데이터 타입으로 순서를 가지지만 크기(size)가 정해지지 않아 크기에 관계없이 데이터 추가가 가능하다.
기본적으로 Immutable
(수정 불가) 타입이므로 데이터 수정을 위해서는 MutableList
선언이 필요하다.
val list1: List<Int> = List(3) { i -> i } // [0, 1, 2]
val list2 = mutableListOf<Int>(1, 2, 3, 4, 5) // [1, 2, 3, 4, 5]
arrayListOf / linkedListOf
arrayListOf
java.util.ArrayList
인스턴스를 생성한다.
- 추가, 삭제 등의 수정이 가능하다.
- 기본적으로
Array
를 사용하지만 크기를 지정하지 않고 동적으로 값을 할당하고 삭제할 수 있다. - 각 데이터의 index 를 가지고 있고 무작위 접근이 가능하기 때문에 해당 index 의 데이터를 가져오기 용이하다.
- 예를 들어 3개의 데이터가 있을 때 맨 앞의 데이터를 삭제하였다면 나머지 뒤의 2개의 데이터를 앞으로 한칸씩 이동해야하기 때문에 데이터 추가, 삭제가 많다면 비효율적이다.
val arrayList = arrayListOf(1, 2, 3)
linkedListOf
java.util.LinkedList
인스턴스를 생성한다.
- 추가, 삭제 등의 수정이 가능하다.
- 내부적으로 양방향의 연결 리스트로 구성되어 있기 때문에 참조하려는 원소에 따라 정방향 또는 역순으로 조회한다.
- 요소에 대해 순차적으로 접근하기 때문에 조회의 속도가 느라다.
- 예를 들어 3개의 데이터가 있을 때 2번째 데이터를 삭제하였다면 1번째 노드가 마지막 노드를 가리키게 하면 되기 때문에 데이터 추가, 삭제 시 가리키고 있는 주소값만 변경해주면 되어서 효율적이다.
val linkedList = linkedListOf(1, 2, 3)
Collection Methods
forEach()
목록에 반복 처리를 할 수 있는 함수이다.
fun main() {
val array = arrayOf(1, 2, 3, 4, 5)
// 람다
array.forEach({ element ->
print("$element, ")
})
println()
// 괄호'()' 생략 가능
array.forEach { element ->
print("$element, ")
}
println()
// it 으로 수신 객체에 접근 가능
array.forEach {
print("$it, ")
}
}
// 1, 2, 3
// 1, 2, 3
// 1, 2, 3
filter()
목록에 조건을 걸어 그 조건에 맞는 새로운 목록을 반환하는 함수이다.
fun main() {
val array = arrayOf(1, 2, 3, 4, 5) // => 1,2,3,4,5 배열을 생성한다.
// 조건에 충족되는 목록을 반환
array.filter({ e -> e % 2 == 0 })
.forEach { println(it) }
// 괄호'()' 생략 가능
array.filter { e -> e % 2 == 0 }
.forEach { println(it) }
// it 으로 수신 객체에 접근 가능
array.filter { it % 2 == 0 }
.forEach { println(it) }
}
// 2
// 2
// 2
map()
목록의 요소를 변경하여 새로운 목록을 반환하는 함수이다.
fun main() {
val array = arrayOf(
Person("A", 10),
Person("B", 20),
Person("C", 30),
)
// 람다로 user 인스턴스 접근 가능
array.map({ user -> user.name })
.forEach { print("${it}, ") }
println()
// 괄호'()' 생략 가능
array.map { user -> user.name }
.forEach { print("${it}, ") }
println()
// it 으로 수신 객체에 접근 가능하며 it 은 user 인스턴스를 가리킴
array.map { it.name }
.forEach { print("${it}, ") }
}
data Person(
val name: String,
val age: Int
)
// A, B, C
// A, B, C
// A, B, C
sum()
입력한 숫자를 합산해주는 함수이다.
fun main() {
val array = arrayOf(1, 2, 3)
println(array.sum())
}
// 6
take()
목룍의 요소를 입력한 숫자 만큼 가져오는 함수이다.
fun main() {
val array = arrayOf(1, 2, 3)
array.take(1)
.forEach { print(it) }
println()
array.take(2)
.forEach { print(it) }
println()
array.take(3)
.forEach { print(it) }
}
// 1
// 12
// 123
drop()
목록의 요소를 앞에서부터 입력한 숫자만큼 제거하고 가져오는 함수이다.
fun main() {
val array = arrayOf(1, 2, 3)
array.drop(1)
.forEach{print(it)}
println()
array.drop(2)
.forEach{print(it)}
}
// 23
// 3