본문 바로가기
Kotlin/Kotlin 프로그래밍

[Kotlin] 컬렉션(Collection) - List

by 주 녕 2021. 5. 24.
728x90

모든 내용은 Do it! 코틀린 프로그래밍을 바탕으로 정리한 것입니다. 

 

컬렉션(Collection)

컬렉션은 자주 사용하는 기초적인 자료구조를 모아 놓은 일종의 프레임워크로 표준 라이브러리로 제공하고 있음

 

코틀린의 컬렉션 종류

  • 코틀린의 컬렉션은 자바 컬렉션의 구조를 확장 구현한 것
    • 자바와는 다르게 불변형(immutable - 읽기 전용)과 가변형(mutable)로 나뉨
    • 자바에서는 오로지 가변형 컬렉션만 취급되므로 자바와 상호작용하는 코드에서는 주의해야 함
컬렉션 불변형 헬퍼 함수 가변형 헬퍼 함수
List   listOf   mutableListOf, arrayListOf
Set   setOf   mutableSetOf, hashSetOf, linkedSetOf, sortedSetOf
Map   mapOf   mubaleMapOf, hashMapOf, linkedMapOf, sortedMapOf

* 변수를 선언할 때 불변형 val의 사용을 권장하듯이, 컬렉션도 불변형으로 선언할 것을 권장함

* 헬퍼 함수 : 컬렉션은 직접 사용해 생성하지 않고 특정 함수의 도움을 통해 생성하는데, 이때 사용하는 함수를 헬퍼(Helper) 함수라고 함

 

컬렉션 인터페이스

  • 가장 상위에 있는 Iterable 인터페이스 : 컬렉션이 연속적인 요소를 표현할 수 있도록 함
    • iterator()는 hasNext()와 next() 메서드를 가지고 요소를 순환함
    • hasNext() : 읽을 요소가 있는지 확인하는 메서드
    • next() : 데이터를 반환하는 메서드

 

  • Collection 인터페이스 - 불변형
    • 여기서 확장된 Set과 List 인터페이스 또한 읽기 전용 컬렉션임
  size   컬렉션의 크기
  isEmpty()   컬렉션이 비어있으면 true를 반환함
  contains(element: E)   특정 요소가 있다면 true를 반환함
  containsAll(element: Colleciton<E>)   인자로 받아들인 컬렉션이 있다면 true를 반환함

 

  • MutableIterable과 MutableCollection 인터페이스 - 가변형
    • 여기서 확장된 MutableSet, MutableList 또한 가변형 컬렉션임
  add(element: E)   인자로 전달받은 요소를 추가하고 true 반환 / 이미 있거나 중복이 허용되지 않으면 false 반환
  remove(element: E)   인자로 전달받은 요소를 삭제하고 true 반환 / 삭제하려는 요소가 없다면 false 반환
  addAll(elements: Collection<E>)   컬렉션을 인자로 받아 모든 요소를 추가하고 true 반환 / 실패 시 false 반환
  removeAll(elements: Collection<E>)    컬렉션을 인자로 받아 모든 요소를 삭제하고 true 반환 / 실패 시 false 반환
  retainAll(elements: Collection<E>)    인자로 전달받은 컬렉션의 요소만 보유하고 true 반환 / 실패 시 false 반환
  clear()   컬렉션의 모든 요소 삭제

 

 


 

List

순서에 따라 정렬된 요소를 가지는 컬렉션

 

불변형 List

 listOf() 메서드

public fun <t> listOf(vararg elements: T): List<T>
  • vararg는 가변 인자를 받을 수 있기 때문에 원하는 만큼 요소를 지정할 수 있음
  • 값을 반환할 때는 List<T>를 사용함
    • 형식 매개변수 <T>는 원하는 자료형을 지정해 선언할 수 있고, 사용하지 않으면 <Any>로 자료형을 혼합할 수 있음
fun main() {
    var numbers: List<Int> = listOf(1, 2, 3, 4, 5)
    var names: List<String> = listOf("one", "two", "three")
    var mixedTypes = listOf("Hello", 1, 2.432, 's')

    for (name in names) {
        println(name)
    }
    for (number in numbers) print(number)
    println()
}

 

emptyList() 메서드 

비어 있는 List를 생성하려면 emptyList<>()를 사용할 수 있음

이때 반드시 형식 매개변수를 지정해야 함

val emptyList: List<String> = emptyList<String>()

 

listOfNotNull() 메서드

null을 제외한 요소만 반환해 List를 구성할 수 있음

val nonNullsList: List<Int> = listOfNotNull(2, 24, 3, null, 5, null)
println(nonNullsList)  // [2, 24, 3, 5]

 

List의 주요 멤버 메서드

  get(index: Int)   특정 인덱스를 인자로 받아 해당 요소를 반환함
  indexOf(element: E)   인자로 받은 요소가 첫 번째로 나타나는 인덱스를 반환하며, 없으면 -1 반환
  lastIndexOf(element: E)   인자로 받은 요소가 마지막으로 나타나는 인덱스를 반환하며, 없으면 -1 반환
  listIterator()   인자로 받아들인 컬렉션이 있다면 true를 반환함
  subList(fromIndex: Int, toIndex: Int)   특정 인덱스의 from과 to 범위에 있는 요소 목록을 반환함

 


 

 

가변형 List

가변형 헬퍼 함수를 사용하면 요소를 쉽게 추가하거나 삭제할 수 있는 List를 생성할 수 있음

arrayListOf() 메서드

public fun <T> arrayListOf(vararg elements: T): ArrayList<T>
  • 가변형 List를 생성하지만 반환 자료형은 자바의 ArrayList임
import java.util.*

fun main() {
    val stringList: ArrayList<String> = arrayListOf<String>("Hi", "Hello", "Bye")
    stringList.add("Java")
    stringList.remove("Hello")
    println(stringList)  // [Hi, Bye, Java]
}
  • 위 예제의 List는 가변형이기 때문에 add()와 remove()를 통해 요소를 추가하거나 삭제할 수 있음
  • 컴파일할 때 반환되는 자료형은 List가 아닌 자바의 ArrayList임

 

mutableListOf() 메서드

public fun <T> mutableListOf(vararg elements: T): MutableList<T>
  • MutableList 인터페이스를 사용하는 헬퍼 함수 mutableListOf()를 통해 List의 요소를 추가, 삭제, 교체할 수 있음
  • 반환형은 ArrayList가 아닌 MutableList 임
fun main() {
    val mutableList: MutableList<String> = mutableListOf<String>("Apple", "Banana", "Carrot")
    mutableList.add("Dorazi")
    mutableList.removeAt(1)
    mutableList[0] = "Bori"
    println(mutableList)  // [Bori, Carrot, Dorazi]

    val mutableListMixed = mutableListOf("Android", "iOS", 1, 25, 'X')
    println(mutableListMixed)  // [Android, iOS, 1, 25, X]
}
  • add(), removeAt() 메서드를 통해 요소를 추가, 삭제할 수 있음
  • set() 또는 대괄호 표현을 통해 인덱스에 해당하는 요소를 바로 변경할 수 있음
  • 특정 자료형의 제네릭을 생략하면 여러 가지 자료형으로 구성된 MutableList를 할당할 수 있음

 

💡 불변형 List → 가변형 List?

fun main() {
    val names: List<String> = listOf("one", "two", "three")  // 불변형
    val mutableName = names.toMutableList()  // 새로운 가변형
    mutableName.add("four")
    println(mutableName)  // [one, two, three, four]
}
  • toMutableList() : 불변형 List를 가변형으로 변경하는 메서드
    • 기존의 List는 그대로 두고 새로운 공간을 만듦

 

 

* 코틀린 컬렉션 Set, Map에 대한 내용은 다음 포스팅 참고!

 

[Kotlin] 컬렉션(Collection) - Set, Map

모든 내용은 Do it! 코틀린 프로그래밍을 바탕으로 정리한 것입니다. 컬렉션(Collection) 컬렉션은 자주 사용하는 기초적인 자료구조를 모아 놓은 일종의 프레임워크로 표준 라이브러리로 제공하고

junyoung-developer.tistory.com

 

728x90

댓글