Study Record

[Kotlin] Collection 본문

안드로이드/Kotlin

[Kotlin] Collection

초코초코초코 2022. 4. 7. 03:20
728x90

😶 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)
}

 

 

 

 

Collections overview | Kotlin

 

kotlinlang.org

 

 

728x90

'안드로이드 > 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