본문 바로가기
Android/안드로이드 스터디(Kotlin)

Kotlin] 48. Mutable Collection

by 김마리님 2020. 12. 23.

기본적으로 코틀린이 가진 collection은 다 변경할 수 없는 컬렉션이다. 그렇기 때문에 Thread-self 하다.

그러나.. 우리는 자바유저들.. 우리는... 변경이 매우 익숙하다.. 코틀린도 물론 컬렉션을 변경할 수 있는 컬렉션을 따로 제공한다. 그것이 MutableCollection이다.

 

이것은 기존에 collection이 가지는 멤버함수 이외에 몇몇 멤버함수를 더 가진다.

 

add(value) : 기존 컬렉션 뒤에 값을 하나 더 추가한다

addAll(collection) : 기존 컬렉션 뒤에 컬렉션 값을 더 추가한다

remove(value) : 해당 값을 찾아 하나 삭제한다. 이 때, 컬렉션의 가장 앞의 값을 먼저 제거한다.

removeAll(collection) : 해당 컬렉션에 포함된 값을 '전부' 삭제한다.

retainAll(collection) : 해당 컬렉션에 포함된 값을 제외하고 전부 삭제한다.

clear() : 컬렉션 내부 값을 모두 삭제한다.

 

예시를 보자

package mutableCollectionEx

fun main() {
    val list : MutableCollection<Int> = mutableListOf(1,2,4,2,3,2,5)
    println("list : $list")

    list.add(1)
    println("add : $list")

    list.addAll(listOf(2,3,4))
    println("addAll : $list")

    list.remove(1)
    println("remove : $list")

    list.removeAll(listOf(2,3))
    println("removeAll : $list")

    list.retainAll(listOf(4,5))
    println("retainAll : $list")

    list.clear()
    println("clear : $list")
}

 

결과값 :

 

list : [1, 2, 4, 2, 3, 2, 5]
add : [1, 2, 4, 2, 3, 2, 5, 1]
addAll : [1, 2, 4, 2, 3, 2, 5, 1, 2, 3, 4]
remove : [2, 4, 2, 3, 2, 5, 1, 2, 3, 4]
removeAll : [4, 5, 1, 4]
retainAll : [4, 5, 4]
clear : []

 


 

그럼 기존에 non-mutable했던 다른 컬렉션들은 어떻게 됐느냐면...

 

MutableItartor은 기존 멤버변수 + mutable 멤버함수에 다음 멤버함수가 더 추가된다. 

 

remove : 커서가 가리키고 있는 원소를 삭제한다.

 

예시를 보자.

package mutableCollectionEx

fun main() {
    val list = mutableListOf(1,2,3)
    val iter = list.iterator()

    println("list : $list")

    iter.next(); iter.remove()
    println("remove1 : $list")

    iter.next(); iter.remove()
    println("remove2 : $list")
    
}

 

next함수를 통해 -1을 가리키던 커서가 0을 가리키고, 그 값이 삭제된다.

마찬가지로 1로 이동되고 삭제되고, 2로 이동하면서 다시 삭제한다.

그래서 최종적인 결과는

 

list : [1, 2, 3]
remove1 : [2, 3]
remove2 : [3]

 

로 출력된다.

 

 


 

mutableList는.. index가 존재하니까 그 값이 추가된 함수가 추가되었다.

 

add(index, element) : 해당 인덱스에 element 추가

addAll(index, collection) : 해당 인덱스에 컬렉션 추가

set(index, element) : 해당 인덱스의 값을 element로 교체하고, 기존에 있던 값 반환

removeAt(index) : 해당 인덱스 값 삭제, 삭제된 값 반환

 

예시를 보자

package mutableCollectionEx

fun main() {

    val list : MutableList<Char> = mutableListOf('c','a','b')
    println("list : $list")

    list.add(1,'%')
    println("add : $list")

    list.addAll(0, listOf('L','P'))
    println("addAll : $list")

    println(list.set(2,'/'))
    println("set : $list")

    println(list.removeAt(4))
    println("removeAt : $list")
    
}

 

결과값 :

 

list : [c, a, b]
add : [c, %, a, b]
addAll : [L, P, c, %, a, b]
c
set : [L, P, /, %, a, b]
a
removeAt : [L, P, /, %, b]

 

 


 

MutableListIterator는 기존 MutableList 멤버함수에 함수를 하나 더 추가한다.

add : 현재 가리키고 있는 커서에 add한다.

 

예시를 보자.

fun main() {
    val list = mutableListOf(1,2,3)
    val iter : MutableListIterator<Int> = list.listIterator()

    println(list)

    iter.next(); iter.next()
    iter.add(7)
    println("add1 : $list")

    iter.next()
    iter.add(12)
    println("add2 : $list")

}

 

결과 : 

 

[1, 2, 3]
add1 : [1, 2, 7, 3]
add2 : [1, 2, 7, 3, 12]

 

 

이게.. add되고 난 후에는 add된 값 뒤로 커서가 넘어가는 거 같다..

이렇게 말이다.

 


 

mutableSet은 별 다르게 추가된 건 없고 set 함수의 특성만 알면 된다.

package mutableCollectionEx

fun main() {
    val set : MutableSet<Int> = mutableSetOf(1,3,7)
    println(set)

    println(set.add(3))
    println(set)

    println(set.addAll(setOf(5,7)))
    println(set)
}

 

결과 :

[1, 3, 7]
false
[1, 3, 7]
true
[1, 3, 7, 5]

 

add(3)은 이미 set속에 3이 있으니 추가되지 못하고 false를 반환하고 같은 set을 반환한다.

addAll(5,7)은 7은 이미 있어서 추가되지 못하고, 5는 없기 때문에 추가되면서 true를 반환한다.

값은 5만 추가되어 출력된다.

 

 


 

mutableMap은 collection과 다른 인터페이스를 사용하기 때문에.. 추가되는 함수가 좀 많다.

 

put : 키, 값 쌍을 map에 넣고 null을 반환한다. 이 때 같은 key가 있다면 기존 value를 반환하고 값이 교체된다.

map[key] = value 형태로 넣는 것도 가능하다.

putAll : 키 - 값 쌍으로 된 map을 통채로 붙인다.

remove(key) : key값을 가진 key-value를 삭제하고, 삭제했으면 true, 안했으면 false를 반환한다.

remove(key,value) : 같은 key-value 값을 가진 쌍을 삭제하고, 삭제했으면 true, 안했으면 false를 반환한다.

clear : 맵의 값을 모두 지운다.

 

예시를 보자.

 

package mutableCollectionEx

fun main() {
    val map : MutableMap<String, String> = mutableMapOf()
    println("map : $map")

    println(map.put("Hi","안녕"))
    println("put1 : $map")

    println(map.put("Hi","안녕하세요"))
    println("put2 : $map")

    map["nice"] = "좋아"
    println("map : $map")

    map.putAll(mapOf("How is it going?" to "잘지내니?", "Bye" to "잘가"))
    println("putAll : $map")

    println(map.remove("Hi"))
    println("remove1 : $map")

    println(map.remove("Bye", "잘"))
    println("remove2 : $map")

    println(map.remove("Bye", "잘가"))
    println("remove3 : $map")

    map.clear()
    println("clear : $map")

}

 

 

결과 :

 

map : {}
null
put1 : {Hi=안녕}
안녕
put2 : {Hi=안녕하세요}
map : {Hi=안녕하세요, nice=좋아}
putAll : {Hi=안녕하세요, nice=좋아, How is it going?=잘지내니?, Bye=잘가}
안녕하세요
remove1 : {nice=좋아, How is it going?=잘지내니?, Bye=잘가}
false
remove2 : {nice=좋아, How is it going?=잘지내니?, Bye=잘가}
true
remove3 : {nice=좋아, How is it going?=잘지내니?}
clear : {}

반응형

'Android > 안드로이드 스터디(Kotlin)' 카테고리의 다른 글

Kotlin] 50. 컬렉션 정렬  (0) 2020.12.24
Kotlin] 49. sequence  (0) 2020.12.23
Kotlin] 47. Collection  (0) 2020.12.23
Kotlin] 46. Iterable 인터페이스  (0) 2020.12.23
Kotlin] 45. ClosedRange  (0) 2020.12.23