언어마다 필수적으로 리스트나 맵 셋 같은 자료형들을 모아놓은 자료구조들을 지원합니다. 이러한 용소들은 대부분의 언어에서 필수적입니다. 오늘은 그 많은 자료구조 중 Kotlin의 Collection을 알아볼까 합니다.
구조로는 기본적으로 mutable이 붙지 않은 List, Set, Map과 Mutable이 붙은 MutableList, MutableSet, MutableMap이 있습니다. 기본적인 이 List나 Set,Map같은 경우에는 한번 정의하게 되면 값을 추가하거나 삭제할 수 없습니다. 그렇지만 MutableCollection과 List,Set,Map을 상속받은 MutableList, MutableSet, MutableMap 같은 경우 중간에 값을 추가할 수 있습니다.
val list = listOf(1, 2, 3)
//1번
if (list is MutableList) {
list.add(4)
}
//2번
val mutableList = list.toMutableList()
mutableList.add(4)
그렇다고 1번처럼 사용하면 안 됩니다. java.lang.UnsupportedOperationException 같은 오류가 발생하기 때문에 값을 추가하고 싶다면 2번처럼 MutableList를 새롭게 만들어서 값을 추가해야 합니다.
가변성에 대해서 더 알고 싶다면 이 글을 봐보세요
https://seedpotato.tistory.com/227
List
정렬된 일반적인 요소 컬렉션입니다. 이 컬랙션의 경우 데이터목록의 순서가 있으며 index로 값을 가져올 수 있습니다.
그렇지만 위에서 말한 데로 값의 삭제나, 추가는 할 수 없으며 값의 변경도 불가합니다.
//생성
//listOf()
//listOf(varargs)
val numbers: List<Int> = listOf(1, 2, 3, 4, 5)
//List 생성자이용
//List<자료형>(size){인덱스 -> 초기값 }
val numbers = List<Int>(5){ idx -> idx + 1 }
//접근
//get()
println( numbers.get(0) ) //0
//대괄호
println( numbers[2] ) //3
Set
Set은 중복요소가 없는 Collection입니다. 순서가 정해져 있지 않으면 null 객체를 가지고 있을 수도 있습니다.
//생성
//setOf()
//setOf(varargs)
val set = setOf<Int>(1,1,2,3,4)
//이용
print(set.size) //크기확인
print(set.contains(1)) //값의 유무 확인
Map
key와 value가 있는 Collection입니다. key의 경우 유일성을 가집니다
//생성
//mapOf()
//mapOf(varargs)
val map = mapOf<Int,Int>(1 to 1,2 to 2,3 to 3,4 to 4)
//Pair이용
val map = mapOf<Int,Int>(Pair(1,1),Pair(2,2),Pair(3,3),Pair(4,4))
//접근
//get()
println( numbers.get(1) ) //0
//대괄호
println( numbers[2] ) //3
//이용
println(map.keys)//Set<Int>
println(map.values)//List<Int>
MutableCollection
위에서 말한 Collection에서 추가 및 삭제 및 변경기능을 추가한 것 입니다.
//생성
//mutableListOf()
//mutableSetOf()
//mutableMapOf()
val numbers: MutableList<Int> = mutableListOf(1, 2, 3, 4, 5)
//MutableList 생성자이용
//MutableList<자료형>(size){인덱스 -> 초기값 }
val numbers = MutableList<Int>(5){ idx -> idx + 1 }
//접근,리스트나 map의 경우 가능
//get()
println( numbers.get(0) ) //0
//대괄호
println( numbers[2] ) //3
// 요소 추가
numbers += 1 // 맨 뒤에 요소 추가
numbers += listOf(1, 2, 3) // 맨 뒤에 요소 추가
numbers.add(6) // 맨 뒤에 요소 추가
numbers.add(1, 7) // 인덱스 1 위치에 요소 추가
numbers.add(listOf(1, 2, 3)) // 맨 뒤에 요소 추가
numbers.add(1, listOf(1, 2, 3)) // 인덱스 1 위치에 요소 추가
// 요소 제거
numbers.remove(3) // 값이 3인 요소 제거
numbers.removeAt(0) // 인덱스 0 위치의 요소 제거
numbers.removeIf { it < 0 } // 조건에 맞을경우 삭제
numbers.clear()
// 요소 수정,리스트나 map의 경우 가능
numbers[2] = 8 // 인덱스 2 위치의 요소 수정
Collection 공통함수
//forEach, 각 요소에 대해 특정 작업을 수행합니다.
val numbers = listOf(1, 2, 3, 4, 5)
numbers.forEach { println(it) }
//filter, 조건을 만족하는 요소만 필터링하여 새로운 컬렉션을 생성합니다.
val numbers = listOf(1, 2, 3, 4, 5)
val evenNumbers = numbers.filter { it % 2 == 0 }
//map, 각 요소를 변형하여 새로운 컬렉션을 생성합니다.
val numbers = listOf(1, 2, 3, 4, 5)
val squaredNumbers = numbers.map { it * it }
//find, 조건을 만족하는 첫 번째 요소를 반환합니다.
val numbers = listOf(1, 2, 3, 4, 5)
val evenNumber = numbers.find { it % 2 == 0 }
//any, 컬렉션에 조건을 만족하는 요소가하나라도있다면 true를 반환합니다.
val numbers = listOf(1, 2, 3, 4, 5)
val hasEvenNumber = numbers.any { it % 2 == 0 }
//all, 컬렉션의 모든 요소가 조건을 만족한다면 true를 반환합니다.
val numbers = listOf(1, 2, 3, 4, 5)
val allEvenNumbers = numbers.all { it % 2 == 0 }
//reduce, 컬렉션의 요소를 순차적으로 조합하여 하나의 값으로 줄입니다.
val numbers = listOf(1, 2, 3, 4, 5)
val sum = numbers.reduce { acc, value -> acc + value }
//fold, reduce와 비슷하지만 초기값을 설정할수 있습니다
val numbers = listOf(1, 2, 3, 4, 5)
val sum = numbers.fold(10) { acc, value -> acc + value }
//count, 컬렉션 내의 요소 수를 반환합니다.
val numbers = listOf(1, 2, 3, 4, 5)
val count1 = numbers.count()//5
val count2 = numbers.count{ it%2==0 }
//max,min, 정수나 실수를 가진 컬렉션 내의 최댓값과 최솟값을 반환합니다.
val numbers = listOf(1, 2, 3, 4, 5)
val maxNumber = numbers.max()
val minNumber = numbers.min()
//distinct, 중복 요소를 제거한 새로운 컬렉션을 반환합니다.(컬랙션의 형태는 변하지 않습니다)
val numbers = listOf(1, 2, 2, 3, 3, 4, 5)
val distinctNumbers = numbers.distinct()
//sorted, 컬렉션을 오름차순으로 정렬한 새로운 컬렉션을 반환합니다.
val numbers = listOf(5, 3, 1, 4, 2)
val sortedNumbers = numbers.sorted()
//sortedDescending, 컬렉션을 내림차순으로 정렬한 새로운 컬렉션을 반환합니다.
val numbers = listOf(5, 3, 1, 4, 2)
val sortedNumbers = numbers.sortedDescending()
//groupBy, 지정된 키 함수를 기준으로 컬렉션을 그룹화합니다.
data class Person(val name: String, val age: Int)
val people = listOf(
Person("Alice", 20),
Person("Bob", 25),
Person("Charlie", 20)
)
val peopleByAge = people.groupBy { it.age }//자료형 Map<Int,List<Person>>
//partition, 조건을 기준으로 컬렉션을 두 개의 쌍으로 분할합니다.
val numbers = listOf(1, 2, 3, 4, 5)
val (evenNumbers, oddNumbers) = numbers.partition { it % 2 == 0 }
//zip, 두 개의 컬렉션을 결합하여 새로운 컬렉션을 생성합니다.
val numbers = listOf(1, 2, 3)
val letters = listOf("A", "B", "C")
val zipped = numbers.zip(letters) // 자료형 List<Pair<Int,String>> [(1, "A"), (2, "B"), (3, "C")]
'코틀린 > 문법및 라이브러리' 카테고리의 다른 글
[Kotlin] 여러 종류의 반복문 (0) | 2023.08.04 |
---|---|
[Kotlin] 교집합(intersect), 합집합(union), 차집합(subtract) (0) | 2023.07.31 |
[Kotlin] Result class 가 뭐지? (0) | 2023.07.26 |
[Kotlin] Contract 로 스마트 케스팅 (0) | 2023.07.18 |
[Kotlin] 시퀀스(Sequence) 파보기 (0) | 2023.07.13 |