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

Suyong Lee·2021년 9월 11일
0

Kotlin

목록 보기
13/16
post-thumbnail

컬렉션을 처리할 때 쓸 수 있는 코틀린 표준 라이브러리 함수 몇 가지를 알아보자.

다음과 같은 코틀린 언어 특성을 알 수 있다.

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

다 처음 듣는 용어들이다..ㅠ

자바 컬렉션 API 확장

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

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

위의 코드는 자바 라이브러리 클래스의 인스턴스인 컬렉션에 대해 코틀린이 새로운 기능을 추가했기 때문에 작동한 코드다.

last와 max는 확장 함수이기 때문이다.

fun <T> List<T>.last() : T { // 마지막 원소를 반환 }
fun Collection<Int>.max() : Int { // 컬렉션의 최댓값을 찾음 }

이게 last와 max 함수의 정체다.

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

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

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

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

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

varargs 란 자바의 가변 길이 인자다.

가변 길이 인자란?
메서드를 호출할 때 원하는 개수만큼 값을 인자로 넘기면 자바 컴파일러가 배열에 그 값들을 넣어주는 기능이다.
(컬렉션에 무한의 데이터를 동적으로 넣을 수 있었던 이유다.)

원소를 가변 길이 인자로 넘기는 구문은 자바와 코틀린이 다르다.

코틀린은 배열을 명시적으로 풀어서 배열의 각 원소가 인자로 전달되게 해야하는데, 기술적으로는 스프레드 연산자가 그런 작업을 한다.

표현법은 간단히 전달하려는 배열 앞에 *를 붙이기만 하면 된다.

fun main(args:Array<String>) {
	val list = listOf("args: ", *args) // 스프레드 연산자가 배열의 내용을 펼쳐준다.
    println(list)
}

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

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

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

위 코드는 중위 호출 이라는 특별한 방식으로 to라는 일반 메서드를 호출한 것이다.

인자가 하나뿐인 일반 메서드나 인자가 하나뿐인 확장 함수에 중위 호출을 사용할 수 있다.

중위 호출이란?
중위 호출이란 클래스의 멤버를 호출할 때 점과 소괄호를 붙이지 않음을 통해 직관적인 이름을 사용할 수 있는 표현방식을 말한다.

함수를 중위 호출에 사용하게 허용하고 싶으면 infix 변경자를 함수 선언 앞에 추가해야 한다.

다음은 to 함수의 정의를 간략하게 줄인 코드다.

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

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

Pair
Pair는 코틀린 표준 라이브러리 클래스로 그 이름대로 두 원소로 이뤄진 순서쌍을 표현한다. 위 코드에서 Pair 클래스의 인스턴스가 쓰였다.

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

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

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

profile
이수용

0개의 댓글

관련 채용 정보