728x90
반응형

코틀린에서 컬렉션 만들기

컬렉션을 만드는 방법은 자바와 비슷함

val set = hashSetOf(1, 7, 53)
val list = arrayListOf(1, 7, 53)
val map = hashMapOf(1 to "one", 7 to "seven", 53 to "fifty-three")

 


 

코틀린이 자체 컬렉션을 제공하지 않는 이유?

표준 자바 컬렉션을 활용하면 자바 코드와 상호작용하기가 훨씬 더 쉽기 때문

때문에 자바에서 코틀린 함수를 호출하거나 코틀린에서 자바 함수를 호출할 때 자바와 코틀린 컬렉션을 서로 변환할 필요가 없음

하지만 코틀린에서는 자바보다 더 많은 기능을 쓸 수 있음

fun main(args: Array<String>) {
    val strings = listOf("first", "second", "fourteenth")
    println(strings.last()) // 리스트의 마지막 원소를 가져온다. 
    val numbers = setOf(1, 14, 2)
    println(numbers.max()) // 컬렉션에서 최댓값을 가져온다. 
}

 


 

함수를 호출하기 쉽게 만들기

자바 컬렉션에는 컬렉션에는 디폴트 toString 구현이 들어있음

val list = listOf(1, 2, 3)
println(list)
// [1, 2, 3]

디폴트 구현과 달리 (1; 2; 3)처럼 원소 사이를 세미콜론으로 구분하고 괄호로 리스트를 둘러싸고 싶다면?

 

처음에는 함수 선언을 간단하게 만들수 있게 코틀린이 지원하는 여러 기능을 사용하지 않고 함수를 직접 구현함

그 후 좀 더 코틀린답게 같은 함수를 다시 구현함

fun <T> joinToString(
        collection: Collection<T>,
        separator: String = ";",
        prefix: String = "(",
        postfix: String = ")"
): String {

    val result = StringBuilder(prefix)

    for ((index, element) in collection.withIndex()) {
        if (index > 0) result.append(separator)
        result.append(element)
    }

    result.append(postfix)
    return result.toString()
}

fun main(args: Array<String>) {
    val list = listOf(1, 2, 3)
    println(joinToString(list, "; ", "(", ")"))
		println(joinToString(collection = list, separator = ";", prefix = "(", postfix = ")"))
		println(joinToString(list))
		println(joinToString(list, "; "))
}

이 함수는 어떤 타입의 값을 원소로 하는 컬렉션이든 처리할 수 있음

제네릭 함수의 문법은 자바와 비슷함

 

더보기

💡 디폴트 값과 자바

 

자바에는 디폴트 파라미터 값이라는 개념이 없어서 코틀린 함수를 자바에서 호출하는 경우에는 그 코틀린 함수가 디폴트 파라미터 값을 제공하더라도 모든 인자를 명시해야 함

자바에서 코틀린 함수를 자주 호출해야 한다면 자바 쪽에서 좀 더 편하게 코틀린 함수를 호출하고 싶을 것임

그럴 때 @JvmOverloads 애노테이션을 함수에 추가할 수 있음

반응형
복사했습니다!