일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Compose
- Dialog
- android
- LifeCycle
- DART
- intent
- CustomScrollView
- Kotlin
- appbar
- 계측
- livedata
- 테스트
- 앱바
- Flutter
- textfield
- Coroutines
- Button
- textview
- activity
- TEST
- data
- binding
- scroll
- 안드로이드
- ScrollView
- Navigation
- drift
- viewmodel
- tabbar
- 앱
- Today
- Total
Study Record
[Kotlin] Collection 본문
😶 Collection
컬렉션은 어떤 관련 항목의 그룹을 뜻하며 순서가 지정된 항목 / 순서가 지정되지 않은 항목이 있을 수 있고, 항목이 고유하거나 고유하지 않을 수 있다.
컬렉션의 종류에는 Array, List, Set, Map 이 있으며 Mutable 키워드가 붙어있으면 항목을 수정/삭제/추가를 할 수 있지만 Mutable 키워드가 없으면 불가능하다.
😶 Array (배열)
배열은 요소(항목)이라고 하는 값이 여러개 포함되어 있고 순서가 지정되어 색인(index)으로 엑세스된다. 색인이란 배열의 요소에 상응하는 정수이다. 배열의 크기는 고정되어 있어 따로 요소를 추가할 수 없다.
Array 선언
val testArray = arrayOf("happy", "Venus", "Earth")
Array 사용법
val test1 = arrayOf("Happy", "Sad", "Motion")
val test2 = arrayOf("Music", "life")
// + 연산자로 새로운 배열 생성 가능
val total = test1 + test2
// 배열 접근
println(test1[2])
// 배열 수정
test1[1] = "No"
😶 List
데이터의 순서를 보장하며 인덱스로 접근이 가능하다. 리스트는 목록 크기 조절이 가능하다. Mutable 이 붙지 않은 List 이기 때문에 수정/삭제/추가가 불가능하다.
List 선언
val number: List<Int> = listof(1,2,3,4,5)
List 항목 참조
val number: List<Int> = listof(1,2,3,4,5)
// 일반적인 참조 방법
print(number[3])
// 첫번째 요소 반환
number.first()
// 마지막 요소 반환
number.last()
List 요소 업데이트 오류
List 는 읽기 전용 목록으로 추가, 삭제, 항목 업데이트를 할 수 없다. 만약 요소를 바꾸려고 하면 다음과 같은 오류 메시지를 볼 수 있다.
Unresolved reference: listof
Unresolved reference. None of the following candidates is applicable because of receiver type mismatch: public inline operator fun kotlin.text.StringBuilder /* = java.lang.StringBuilder */.set(index: Int, value: Char): Unit defined in kotlin.text
No set method providing array access
List 관련 함수
val number: List<Int> = listof(1,2,3,4,5,6)
// 인자로 받은 항목이 리스트에 포함되어 있는지 확인하는 함수
// 포함되어있으면 true / 포함되어있지 않으면 false 을 리턴한다.
number.contains(9)
// 해당 리스트를 정렬하여 새로운 리스트를 리턴한다.
number.sorted()
// 해당 리스트의 역순으로 새로운 리스트를 리턴한다.
number.reversed()
// 섞은(shuffled) 후 앞 순서부터 2개 가져오기(take)
val randomNumber = number.shuffled().take(2)
// for 문으로 요소 반복
for (num in number) {
println(num)
}
😶 MutableList
MutableList 는 요소 추가 및 삭제와 같이 목록을 수정하는 메서드를 정의하여 List 인터페이스를 확장한 클래스이다.
MutableList 선언
val entrees: MutableList<String> = mutableListOf()
MutableList 요소 추가 / 삭제 / 업데이트 / 접근
val entress: MutableList<String> = mutableListOf()
// 추가
entress.add("love")
entress.addAll(listOf("row", "rain"))
// 삭제
entress.remove("row") // 특정 항목 삭제
entress.removeAt(1) // 특정 인덱스 삭제
// 목록 전체 삭제
entress.clear()
// 접근
println(entress[0])
// 비어있는지 확인
println(entress.isEmpty())
MutableList 반복
val names = listOf("Jessica", "Henry", "Alicia", "Jose")
for (name in names) {
println("$name - Number of characters: ${name.length}")
}
😶 Set / MutableSet
수학의 집합과 동일한 개념으로 중복을 허용하지 않고 특정 순서가 없다. Mutable 키워드가 붙지 않으면 수정/삭제/추가가 불가능하다. Set 와 같은 컬렉션이 가능한 이유는 해시 코드이다. 해시 코드는 Kotlin 클래스의 hashCode() 메서드에서 생성된 Int 값인데 Kotlin 의 반고유 식별자로 생각할 수 있다. 객체의 값을 약간만 수정해도 해시 값은 크게 달라진다.
// 데이터의 삭제와 삽입, 수정 가능
val testSet = setOf("int", "short", "main")
// mutable , 데이터의 삭제와 삽입, 수정 가능
val testMutableSet = mutableSetOf("int", "short", "main")
// 특정 항목이 포함되어있는지의 여부 , true
testSet.contains("int")
동일한 항목을 가지고 있고 순서만 다른 Set 과 MutableSet 은 서로 동일한 것으로 간주한다.
val set1 = setOf(1,2,3)
val set2 = mutableSetOf(3,2,1)
// true
println("$set1 == $set2 : ${set1 == set2}")
교집합 / 합집합 연산도 가능하다.
val set1 = setOf(1, 4, 6)
val set2 = mutableSetOf(7, 4, 8)
// 합집합 연산 : [1, 4, 6, 7, 8]
println(set1.union(set2))
// 교집합 연산 : [4]
println(set1.intersect(set2))
// 사이즈
println(set2.size)
// 지정된 요소가 포함되어있는지 확인
println(set1.contains(4))
// mutableSet 항목 추가
set2.add(9)
// 삭제
set2.remove(9)
😶 Map
key와 value를 쌍으로 데이터를 저장한다. key는 고유하며 각 key는 정확히 하나의 value에 매핑되지만 value 는 중복될 수 있다. mutable 키워드가 붙은 Map 만 데이터의 추가/삭제/수정이 가능하다.
// 데이터의 삭제와 삽입, 수정 불가능
val testMap = mapOf("key1" to "value1", "key2" to "value2")
// mutable , 데이터의 삭제와 삽입, 수정 가능
val testMutableMap = mutableMapOf("key1" to "value1", "key2" to "value2")
// 추가
testMutableMap.put("key2", "value2")
testMutableMap["key11"] = "value11"
// 삭제
testMutableMap.remove("key2")
// 키 값만 가져오기
val keys = testMap.keys
😶 반복 (forEach())
컬렉션의 모든 개체를 열거하는 것은 forEach() 를 사용한다.
val list1 = ListOf(1,3,5)
val set1 = setOf(5,7,1)
val map = mapOf(1 to "value1", 2 to "value2", 3 to "value3")
list1.forEach { value ->
println("list $value")
}
set1.forEach { value ->
println("set $value")
}
map.forEach { key, value ->
println("map $key , $value")
}
😶 컬렉션을 사용한 고차 함수
forEach(action: (T) -> Unit)
forEach() 함수는 매개변수로 전달된 함수를 컬렉션의 각 항목에 한 번 실행한다.
fun main() {
val cookies = listOf("a", "b", "c")
cookies.forEach {
println("Menu item: $it")
}
}
map()
map() 함수를 사용하면 컬렉션의 동일한 수의 요소로 구성된 새 컬렉션을 반환할 수 있다.
fun main() {
val cookies = listOf("a", "b", "c")
val plusCookies = cookies.map {
"${it}++"
}
}
filter()
컬렉션의 또 다른 일반적인 작업은 일치하는 항목을 찾는 것이다. filter() 함수는 표현식을 기반으로 일치하는 컬렉션의 항목을 반환한다. filter() 는 단일 람다 표현식을 매개변수로 사용하며 Boolean 값을 반환한다. 람다 표현식의 결과가 true 새 컬렉션에 항목이 포함되고 false 이면 포함되지 않는다.
val list1 = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9)
val subList = list1.filter{ value ->
value % 2 == 0
}
// [2, 4, 6, 8]
println(subList)
groupBy()
groupBy() 함수는 목록(List)을 맵(Map)으로 변환할 수 있다. List 의 항목들을 조건에 따라 true 인 리스트, false 인 리스트로 나눌 수 있다.
fun main() {
val number = listOf(1,2,3,4,5,6,7,8,9)
// Map<Boolean, List<int>>
val groupedNumber = number.groupBy { it % 2 == 0 }
val evenNumber: List<Int> = groupedNumber[true] ?: listOf()
val oldNumber: List<Int> = groupedNumber[false] ?: listOf()
println(evenNumber)
println(oldNumber)
}
fold()
fold() 함수는 컬렉션에서 단일 값을 생성하는데 사용된다. 주로 총가격을 계산하거나 목록의 모든 요소를 합산하여 평균을 구하는 등의 작업에 가장 많이 사용된다.
fun main() {
val number = listOf(1,2,3,4,5,6,7,8,9)
val sumNumber = number.fold(0) { total, value ->
total + value
}
// 45
println(sumNumber)
}
fold() 함수는 초깃값과 람다 표현식을 매개변수로 둔다. 람다 표현식에도 두 가지 매개변수가 있는데 첫 번째 매개변수는(ex. total)는 누산기로 데이터 유형의 초깃값과 동일한 값으로 누산기(=누계)로 이전에 호출된 때의 반환값과 동일하다. 두 번째 매개변수(ex. value)는 컬렉션 값 요소이다.
sortedBy()
원하는 정렬 기준으로 정렬할 수 있다.
data class Example(val name: String, val age: Int)
fun main() {
val person = listOf(Example("김하나", 3),
Example("이하나", 7),
Example("호라나", 10),
Example("김이나", 1))
val sortedPerson = person.sortedBy{ it.age }
println(sortedPerson)
}
'안드로이드 > Kotlin' 카테고리의 다른 글
[Kotlin] 조건부 (0) | 2023.07.03 |
---|---|
[kotlin] 기본 용어 (변수, 함수, 주석, repeat()) (0) | 2023.06.30 |
[Kotlin] Lambda, lateinit, lazy init (0) | 2022.04.05 |
[Kotlin] Scope Function (0) | 2022.04.05 |
[Kotlin] 기본 문법 훑어보기 (0) | 2022.04.05 |