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개로 취급해서 새로 반환