컬렉션 쓰기 연산

컬렉션 쓰기 연산

컬렉션은 요소를 추가하거나 제거하면서 내용을 바꿀 수 있는데, 그런 작업을 하는 연산들을 쓰기(write) 연산이라고 불러요. 이 페이지에서는 MutableCollection의 모든 구현에서 쓸 수 있는 쓰기 연산을 다뤄요. ListMap에 특화된 더 자세한 연산은 각각 List 전용 연산Map 전용 연산 문서에서 확인할 수 있어요.

출처: Kotlin 공식 문서

본문

요소 추가하기

리스트나 세트에 단일 요소를 추가하려면 add() 함수를 써요. 지정한 객체가 컬렉션의 끝에 붙어요.

fun main() {
    val numbers = mutableListOf(1, 2, 3, 4)
    numbers.add(5)
    println(numbers)
}

addAll()은 인자 객체의 모든 요소를 리스트나 세트에 추가해요. 인자는 Iterable, Sequence, Array 중 하나일 수 있어요. 수신 객체와 인자의 타입은 달라도 되는데, 예를 들어 Set의 모든 항목을 List에 추가할 수 있죠.

리스트에 대해 호출하면 addAll()은 새 요소를 인자에 담긴 순서 그대로 추가해요. 요소 위치를 첫 번째 인자로 지정해서 addAll()을 호출할 수도 있는데, 그러면 인자 컬렉션의 첫 번째 요소가 그 위치에 들어가고, 나머지 요소가 뒤따르면서 수신 객체의 기존 요소들은 뒤로 밀려요.

fun main() {
    val numbers = mutableListOf(1, 2, 5, 6)
    numbers.addAll(arrayOf(7, 8))
    println(numbers)
    numbers.addAll(2, setOf(3, 4))
    println(numbers)
}

plus 연산자의 제자리(in-place) 버전인 plusAssign (+=) 으로도 요소를 추가할 수 있어요. 가변 컬렉션에 +=를 적용하면 두 번째 피연산자(요소 하나 또는 다른 컬렉션)가 컬렉션 끝에 붙어요.

fun main() {
    val numbers = mutableListOf("one", "two")
    numbers += "three"
    println(numbers)
    numbers += listOf("four", "five")
    println(numbers)
}

요소 제거하기

가변 컬렉션에서 요소를 제거하려면 remove() 함수를 써요. remove()는 요소 값을 받아서 그 값의 한 번 발생을 제거해요.

fun main() {
    val numbers = mutableListOf(1, 2, 3, 4, 3)
    numbers.remove(3)                    // 첫 번째 `3`을 지워요
    println(numbers)
    numbers.remove(5)                    // 아무것도 지우지 못해요
    println(numbers)
}

여러 요소를 한 번에 제거하려면 이런 함수들이 있어요.

  • removeAll()은 인자 컬렉션에 있는 모든 요소를 제거해요. 대신에 인자로 predicate(조건)를 넘겨 호출할 수도 있는데, 이 경우 조건이 true를 반환하는 모든 요소를 제거해요.
  • retainAll()removeAll()의 반대예요. 인자 컬렉션에 있는 것들을 제외한 모든 요소를 제거하죠. 조건과 함께 쓰면, 그 조건에 맞는 요소만 남겨요.
  • clear()은 리스트에서 모든 요소를 제거하고 빈 상태로 남겨요.
fun main() {
    val numbers = mutableListOf(1, 2, 3, 4)
    println(numbers)
    numbers.retainAll { it >= 3 }
    println(numbers)
    numbers.clear()
    println(numbers)

    val numbersSet = mutableSetOf("one", "two", "three", "four")
    numbersSet.removeAll(setOf("one", "two"))
    println(numbersSet)
}

컬렉션에서 요소를 제거하는 또 다른 방법은 minus의 제자리 버전인 minusAssign (-=) 연산자를 쓰는 거예요. 두 번째 인자는 요소 타입의 단일 인스턴스이거나 다른 컬렉션일 수 있어요. 오른쪽에 단일 요소가 오면 -=는 그것의 첫 번째 발생을 제거해요. 컬렉션이 오면 그 요소들의 모든 발생을 제거하죠. 예를 들어 리스트에 중복 요소가 있다면 그것들이 한꺼번에 제거돼요. 두 번째 피연산자에는 컬렉션에 없는 요소도 담길 수 있는데, 그런 요소는 연산 실행에 영향을 주지 않아요.

fun main() {
    val numbers = mutableListOf("one", "two", "three", "three", "four")
    numbers -= "three"
    println(numbers)
    numbers -= listOf("four", "five")
    //numbers -= listOf("four")    // 위와 같은 일을 해요
    println(numbers)
}

요소 갱신하기

리스트와 맵은 요소를 갱신하는 연산도 제공해요. 이들은 List 전용 연산Map 전용 연산에서 다뤄요. 세트에서는 갱신이라는 게 사실상 요소 하나를 지우고 다른 하나를 더하는 것이라서 의미가 없어요.

더 알아보기 (Learn more)

컬렉션 쓰기 연산은 요소를 추가·제거·갱신하는 기본기를 다져 주는데, 그중에서도 ListMap에는 이 페이지에서 다루지 않은 전용 연산이 더 많아요. 순서를 다루거나 특정 위치를 바꾸는 방법이 궁금하다면 각 전용 연산 문서를 이어서 보는 걸 추천해요.