3. [4] Collection 처리

가변 길이 인자, 중위 함수 호출, 라이브러리 지원

[Kotlin 언어의 특성]

  • varang 키워드를 사용하면 호출 시 인자 개수가 달라질 수 있는 함수를 정의할 수 있다.
  • 중위 함수 호출 구문을 사용하면 인자가 하나뿐인 메서드를 간편하게 호출할 수 있다.
  • 구조 분해 선언을 사용하면 복합적인 값을 분해해서 여러 변수에 나눠 담을 수 있다.

(1) Java 컬렉션 API 확장

val strings: List<String> = listOf("first", "second", "fourteenth")
strings.last()  // fourteeth

val numbers: Collection<Int> = setOf(1, 14, 2)
numbers.max()   // 14
fun <T> List<T>.last(): T { /* 마지막 원소를 반환하는 내용 */}
fun Collection<Int>.max(): Int { /* 컬렉션의 최댓값을 찾는 내용 */ }
  • 해당 last와 max는 확장함수이다.
  • last는 List의 확장함수이다.
  • 컬렉션이나 다른 객체에 사용할 수 있는 메서드나 함수는 IDE의 코드 완성 기능에서 살펴볼 수 있다.

(2) 가변 인자 함수: 인자의 개수가 달라질 수 있는 함수

val list = listOf(2, 3, 5, 7, 11)
fun listOf<T> {varang valus: T}: List<T> {...}
  • varangs는 자바의 가변길이 인자로, 메서드를 호출할 때 원하는 개수 만큼 값을 인지로 넘기는 값을 넣어주는 기능이다.
  • Kotlin의 경우에는 비슷하지만 문법이 다르다. 타입 뒤에 ...을 붙이는 대신 파라미터 앞에 varang 변경자를 붙인다.
  • Java는 이미 들어있는 원소의 배열을 가변 길이 인자로 넘길 때 그냥 넘기면 되지만, Kotlin에서는 배열을 명시적으로 풀어서 배열의 각 원소가 인자로 전달되게 해야 한다.
  • 위의 역할을 해주는 것이 스프레드 연산자이다.
fun main(args: Array<String>) {
  val list = listOf("args: ", *args)  // 스프레드 연산자가 배열의 내용을 펼쳐준다.
  println(list)
}
  • 위 예제는 스프레드 연산자를 통하면 배열에 들어있는 값과 다른 여러 값을 함께 써서 함수를 호출할 수 있음을 보여준다.

(3) 값의 쌍 다루기: 중위 호출과 구조 분해 선언

val map = mapOf(1 to "one", 7 to "seven", 11 to "eleven")
infix fun Any.to(other: Any) = Pair(this, other)
fun<K, V> mapOf(varang values: Pair<K, V>): Map<K, V>
val(number, name) = 1 to "one"
for((index, element) in collection.withIndex()) {
  println("$index: $element")
}
  • 해당 코드는 중위 호출이라는 방식으로 to라는 일반 메서드를 호출한 방식이다. 여기서 to는 Kotlin 키워드가 아니다.
  • 중위 호출 시에는 수신 객체와 유일한 메서드 인자 사이에 메서드 이름을 넣는다.
  • 인자가 하나뿐인 메서드나 확장함수에 중위 호출을 사용할 수 있다.
  • 함수를 중위 호출에 사용하게 허용하고 싶으면 infix 변경자를 함수 선언 앞에 추가해야 한다.
  • to 함수는 Kotlin의 표준 라이브러리 함수인 Pair의 인스턴스를 반환한다. 순서쌍을 표현하는 클래스이다.
  • Pair를 통해 두 변수를 즉시 초기화 하는 해당 기능을 구조 분해 선언이라고 한다.
  • 루프에서도 withIndex를 구조 분해 선언과 함께 조합하면 컬력센 원소와 인덱스의 값을 따로 변수에 담을 수 있다.
  • to 함수는 확장함수이다. 이는 타입과 관계없이 임의의 순서쌍을 만드는 것이 가능하다.
  • mapOf 같은 경우도 원하는 개수만큼 인자를 전달하는 것이 가능하지만, 각 인자가 키와 값의 순서쌍이어야 한다.