010. Collections 처리

Collections 처리

Java의 Collections API 확장

다시 기억을 되살려 코틀린에서의 확장된 API를 가진 Collections를 살펴보자.

1
2
3
4
5
6
>>> val strings: List<String> = listOf("first", "second", "fourteenth") >>> strings.last()
fourteenth

>>> val numbers: Collection<Int> = setOf(1, 14, 2)
>>> numbers.max()
14

코틀린에서 추가로 제공되는 last(), max()등의 API들이 어떻게 동작하고 있다.

1
2
fun <T> List<T>.last(): T { /* returns the last element */ }
fun Collection<Int>.max(): Int { /* finding a maximum in a collection */ }

코틀린의 표준 라이브러리엔 너무나 많은 확장 함수들이 작성되어있기때문에, 모든 확장 함수를 언급할 수는 없다.

그러므로 아래 두 가지 경우에 대한 확장 함수들을 살펴보도록 하자.

가변인자 함수

list를 만들기 위해 listOf() 함수를 호출할 때, 우리는 해당 list에 들어갈 요소들을 파라미터로 넘길 수 있다.

1
val list = listOf(2, 3, 5, 7, 11)

위의 기능이 어떻게 구현되었는지는 표준 라이브러리에서 확인하면 아래와 같다.

1
fun listOf<T>(vararg values: T): List<T> { ... }

Java의 vararg를 이용하면 여러 개의 요소를 배열로 패키징하여 메소드에 파라미터로 넘길 수 있다.

Java에서 ...로 표현하는 것에 반해 코틀린은 명시적으로 vararg 키워드를 사용한다.

만약 넘겨야할 파라미터가 이미 배열로 채워져있는 경우엔 스프레드 연산자 *를 이용해 아래와 같이 처리할 수 있다.

1
2
3
4
fun main(args: Array<String>) {
val list = listOf("args: ", *args)
println(list)
}

중위 호출과 구조 분해 선언

Map 객체를 만들고 싶을 땐 mapOf() 함수를 이용해 만들 수 있다.

1
val map = mapOf(1 to "one", 7 to "seven", 53 to "fifty-three")

이때 호출되는 것은 중위호출이라고 불리는 특별한 종류의 호출이다.

중위호출 : infix call.

이때 infix 호출은 대상의 이름과 파라미터 사이에 즉시 배치된다. 아래의 코드를 보자.

1
2
1.to("one")
1 to "one"

infix 호출은 하나의 파라미터만들 가지는 메소드 및 확장 함수에서도 사용할 수 있다.

아래 예제를 보고 infix 표기법에 대해 좀 더 파악해보자.

1
infix fun Any.to(other: Any) = Pair(this, other)

이때 to함수는 한 쌍을 나타내는 코틀린의 표준 라이브러리인 Pair를 반환한다.

코틀린의 단순성을 유지하기 위해 실제 선언은 생략되었다.

1
val (number, name) = 1 to "one"

Pair를 구성하는 내용을 통해 특정 변수 선언 없이도 즉시 초기화가 가능하다.

1
2
3
for ((index, element) in collection.withIndex()) {
println("$index: $element")
}

위와 같이 선언할 수도 있는데, 이는 구조 분해 선언이라고 한다. 아래에서 다시 다루겠다.