본문 바로가기
Kotlin

[Kotlin in Action] 3.4 컬렉션 처리: 가변 길이 인자, 중위 함수 호출, 라이브러리 지원

by Nhahan 2025. 3. 14.

3.4에서는 컬렉션을 처리할 때 쓸 수 있는 코틀린 표준 라이브러리 함수 몇 가지를 설명한다. 그 과정에서 다음과 같은 코틀린 언어 특성을 설명한다.

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

3.4.1 자바 컬렉션 API 확장

앞에서 자바의 기본 리스트 클래스 함수 뿐만 아니라, 코틀린에서만 지원하는 함수(last, max)가 있었다. 이 코드들은 모두 확장 함수다.

 

3.4.2 가변 인자 함수: 인자의 개수가 달라질 수 있는 함수 정의

리스트를 생성하는 함수를 호출할 때 원하는 만큼 원소를 전달할 수 있다.

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

라이브러리에서 이 함수의 정의를 보면 다음과 같다.

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

코틀린의 가변 길이 인자도 자바와 비슷하다. 다만 문법이 조금 다르다. 타입 뒤에 ...를 붙이는 대신 코틀린에서는 파라미터 앞에 vararg 변경자를 붙인다.

 

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

맵을 만들려면 mapOf 함수를 사용한다.

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

여기서 to라는 단어는 코틀린 키워드가 아니다. 이 코드는 중위 호출(init call)이라는 특별한 방식으로 to라는 일반 메소드를 호출한 것이다.

중외 호출 시에는 수신 객체와 유일한 메소드 인자 사이에 메소드 이름을 넣는다. 다음 두 호출은 동일하다.

1.to("one") // 두 호출은
1 to "one" // 동일하다.

인자가 하나뿐인 일반 메소드나 인자가 하나뿐인 확장 함수에 중위 호출을 사용할 수 있다. 함수를 중위 호출에 사용하게 허용하고 싶으면 infix 변경자를 함수 선언 앞에 추가해야한다. 다음은 to 함수의 정의를 간략하게 줄인 코드다.

infix fun Any.to(other: Any) = Pair(this, other) // 실제로 to는 제네릭 함수지만, 여기서는 간단히 표현

이 to 함수는 Pair의 인스턴스를 반환한다. Pair는 코틀린 표준 라이브러리 클래스로, 그 이름대로 두 원소로 이뤄진 순서쌍을 표현한다.

Pair의 내용으로 두 변수를 즉시 초기화할 수 있다.

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

이런 기능을 구조 분해 선언이라고 부른다.

Pair에 대해 구조 분해가 어떻게 동작하는가

to 함수는 확장 함수다. to를 사용하면 타입과 관계없이 임의의 순서쌍을 만들 수 있다. 이는 to의 수신 객체가 제네릭하다는 뜻이다.

fun <K, V> mapOf(vararg values: Pair<K, V>): Map<K, V>

listOf와 마찬가지로 mapOf에도 원하는 개수만큼 인자를 전달할 수 있다.

 

 

댓글