Skils/Kotlin
[Kotlin] - Collection
재한
2023. 10. 15. 00:08
코틀린 Collection에는 대표적으로 List, Set, Map이
있다. 자바와는 다르게 코틀린에서는 불변형, 가변형 Collection이 있다.
불변형은 읽기 전용, 가변형은 읽고 쓰기 전용 각각의 Collection마다 고유의 기능이 있다.
불변형의 공통적인 기능
- size : 컬렉션의 크기
- isEmpty() : 컬렉션이 비어있는지 확인. 비어있다면 True, 아니라면 False
- contains(element) : 특정 요소가 있다면 true, 아니라면 false
가반형의 공통적인 기능
- add(element) : 추가
- remove(element) : 삭제
- addAll(Collection ) : 인자로 받은 컬렉션의 모든 요소 추가
- removeAll(Collection) : 인자로 받은 컬렉션의 모든 요소를 삭제
- clear() : 컬렉션의 모든 요소 삭제
List
불변형 List
val array : List<String> = listOf("햄버거","피자","치킨")
위와 같은 코드로 불변형 list를 생성할 수 있다.
list의 메서드
- get(index) : 특정 인덱스의 요소를 반환
- indexOf(element) : 첫 번째 인덱스를 반환, 없으면 -1
- lastIndexOf(element) : 마지막 인덱스를 반환, 없으면 -1
- subList(from, to) : from~to 범위 내 요소를 반환
val array : ArrayList<String> = arrayListOf("햄버거","피자","치킨")
val array : MutableList<String> = mutableListOf("햄버거","피자","치킨")
반환타입이 MutableList인데 인자가 list인 경우는 list를 MutableList로 변형해서 사용해야 할 경우도 있습니다.
val list = listOf("햄버거","피자","치킨")
val addList = list.toMutableList()
addList.add("탕수육")
Set
set은 동일한 요소를 중복해서 가질 수 없습니다.
불변형과 가변형 Set
val immutableSet = setOf("햄버거","피자","치킨","탕수육")
immutableSet.add("짜장면") // error
val mutableSet = mutableSetOf(""햄버거","피자","치킨","탕수육")
mutableSet.add("짜장면")
Set의 종류
Hash Set
Hash table이란 내부적으로 키와 인덱스를 이용해서 검색과 변경이 매우 빠르다.
가변성이기 때문에 추가와 삭제가 가능하다.
val hashSet = hashSetOf("햄버거","피자","치킨","탕수육")
SortedSet
데이터의 값에 따라 정렬된 상태로 변환한다.
검색과 정렬이 뛰어나지만, 추가와 삭제 시 항상 정렬을 하기 때문에 HashSet보다 시간이 오래 걸린다.
val sortedSet = sortedSetOf("햄버거","피자","치킨","탕수육")
LinkedSet
LinkedList를 이용한 Hashset으로, 다음 데이터를 가리키는 포인터 연결을 통해 메모리를 효율적으로 사용가능하다.
val linkedSet = linkedSetOf("햄버거","피자","치킨","탕수육")
Map
key와 value가 한쌍의 형태로 저장된다.
Key는 중복될 수 없고, 유일성을 가지며, value는 중복해서 사용할 수 있다.
val map : Map<String,Int> = mapOf("햄버거" to 1)
Map은 Set과 List와 다른 독립적인 메서드를 가진다.
- size : Map의 크기를 반환
- Keys : 모든 key반환
- values : 모든 value 반환
- isEmpty() : 비어있는지 확인 비어있다면 True / 아니라면 false
- containsKey(key) : 해당하는 키가 있다면 True/ 아니라면 false
- containsValue(value) : 해당하는 값이 있다면 true / 아니라면 false
- get(key) : 키에 해당하는 값을 반환
가변형 map의 메서드
- put(key, value) : key와 value를 Map에 추가
- remove(key) : key에 해당하는 요소를 제거
- putAll(Map) : Map에 데이터를 갱신, 추가함
- clear() : 모든 요소 삭제
Collection의 유용한 메서드
sort
Collection의 각 요소들을 정렬해 준다. (오름차순)
val ary : MutableList<Int> = mutableListOf(5,2,4,3)
ary.sort() // 2,3,4,5
ary.reversed() //3,4,2,5
ary.sortedDescending{it} // 5,4,3,2
val list = mutableListOf(1 to "햄버거", 2 to "짜장면", 5 to "치킨", 3 to "피자")
list.sortBy{it.second} //list의 두번째 값을 통해서 정렬
// (1,"햄버거") , (2,"짜장면") , (3,"피자") , (5,"치킨")
map
Collection의 각 요소에 접근해서 연산을 한 후 다른 Collection으로 변환할 수 있다.
val list : List<Int> = listOf(1,2,3)
var a = list.map { it*it } //1,4,9
forEach
Collection의 처음부터 끝까지 순환하는 방법이고, it을 통해서 각 요소에 접근한다.
val list : List<Int> = listOf(1,2,3)
list.forEach{println(it)}
list.forEachIndexed{idx,element->
ary[idx] = element
}
count
Collection에서 조건에 맞는 요소의 개수를 반환한다.
val list = listOf(1,2,3,4,5,6,7)
println(list.count{it>=3}) // 5
filter
조건에 맞는 요소를 컬렉션으로 다시 반환한다.
val list = listOf(1,2,3,4,5,6,7,8,9,10)
val list2 = list.filter{it>=4} // 4,5,6,7,8,9,10
any, all, none
Collection의 모든 요소를 조건에 맞춰서 검사한다.
any : 조건을 하나라도 만족한다면 true를 반환
all : 조건을 모두 만족해야 true를 반환
none : 조건을 모두 만족하지 않는다면 true를 반환
val list = listOf(1,2,3,4)
list.any{it>1} // true
list.all{it>1} //false
list.none{it>1} //false
그 외 유용한 함수
- sumBy : 모든 요소를 합한 결과를 반환함.
- take(index) : 앞에서 index까지의 요소를 반환
- takeLast(index) : 뒤에서 index 만큼 요소를 반환
- distince() : 중복요소가 있을 경우 1개로 취급해서 새로 반환