관리 메뉴

너와 나의 스토리

[Kotlin] 컬렉션과 배열 본문

Programming Language/Kotlin

[Kotlin] 컬렉션과 배열

노는게제일좋아! 2021. 6. 18. 13:57
반응형

컬렉션과 배열

코틀린 컬렉션은 자바 라이브러리를 바탕으로 만들어졌고 확장 함수를 통해 기능을 추가한다. 

 

 

 

널 가능성과 컬렉션

  • 변수 타입 뒤에 ?를 붙이면 그 변수에 널을 저장할 수 있다는 뜻인 것처럼 타입 인자로 쓰인 타입에도 같은 표시를 사용할 수 있다.
val numbers1 = ArrayList<Int>()? // numbers1이 null이 될 수 있다.
val numbers2 = ArrayList<Int?>() // 컬렉션 안에 null 값을 넣을 수 있다.
val numbers3 = ArrayList<Int?>()? // 널이 될 수 있는 값으로 이뤄진 널이 될 수 있는 리스트
  • filterNotNull(): 컬렉션에서 널 값을 걸러내는 함수
fun addValidNumbers(numbers: List<Int?>) {
    val validNumbers = numbers.filterNotNull() // validNumbers는 List<Int> 타입이 됨
    println("Sum of valid numbers: ${validNumbers.sum()}")
}

 

 

읽기 전용과 변경 가능한 컬렉션

  • 코틀린에서는 컬렉션 안의 데이터에 접근하는 인터페이스와 컬렉션 안의 데이터를 변경하는 인터페이스를 분리했다.
    • 데이터에 접근: kotlin.collections.Collection
    • 데이터 변경: kotlin.collections.MutableCollection
  • 기본적으로 코틀린 컬렉션은 불변이다.
  • 코드에서 가능하면 항상 읽기 전용 인터페이스를 사용하는 것을 일반적인 규칙으로 삼는 게 좋다.
    • 다음의 예제와 같이, collection 타입을 명시적으로 보여줌에 따라 source 변수는 읽기 전용임을 알릴 수 있다.
val source: Collection<Int> = arrayListOf(3, 5, 6)
println("size of source: ${source.size}")

 

 

 

객체의 배열과 원시 타입의 배열

  • 코틀린 배열
fun main(args: Array<String>) {
    for (i in args.indices) {
        println("Argument $i is: ${args[i]}")
    }
}
  • 코틀린에서 배열을 만드는 방법:
    • arrayOf 함수에 원소를 넘기기
    • arrayOfNulls 함수에 정수 값을 인자로 넘기면 모든 원소가 null이고 이자로 넘긴 값과 크기가 같은 배열을 만들 수 있다.
    • Array 생성자에 배열 크기와 람다를 인자로 넘기기
      • 널이 아닌 배열로 초기화 가능
      • val letters = Array<String>(26) { i -> ('a' + i).toString() }
        println(letters.joinToString(""))
        // output: abcdefghijklmnopqrstuvwxyz
    • 컬렉션을 배열로 변환하기
      • toTypedArray 메서드 사용
      • val strings = listOf("a", "b", "c")
        println("%s/%s/%s".format(*strings.toTypedArray()))
        // output: a/b/c
  • 다른 제네릭 타입에서처럼 배열 타입의 타입 인자도 항상 객체 타입이 된다.
    • 객체 타입으로 박싱하지 않은 원시 타입의 배열이 필요하다면 그런 타입을 위한 특별한 배열 클래스를 사용해야 한다.
    • 코틀린은 원시 타입의 배열을 표현하는 별도 클래스를 각 원시 타입마다 하나씩 제공한다.
    • 예를 들어, Int 타입의 배열은 IntArray다.
      • ByteArray, CharArray, BooleanArray 등 제공
    • 원시 타입인 원소로 이뤄진 배열에도 확장 함수(filter, map)를 똑같이 사용할 수 있다.
      • 다만 이런 함수가 반환하는 값은 배열이 아니라 리스트이다.

 

 

 

 

 

출처:

- [Kotlin IN ACTION]

반응형
Comments