가변 인자

listOf 함수는 원하는 개수만큼 인자로 넣을 수 있다.

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

listOf 함수는 이렇게 정의되어 있다.

public fun <T> listOf(vararg elements: T): List<T> = if (elements.size > 0) elements.asList() else emptyList()

코틀린에서 가변 길이 인자를 넘기려면 vararg 변경자를 붙이면 된다.

만약 이미 배열에 들어있는 원소를 가변 길이 인자로 넘기려면 코틀린에서는 배열을 명시적으로 풀어서 각 원소가 인자로 전달되도록 해야 한다. 이 작업은 스프레드 연산자(*)가 해준다. 배열 앞에 *를 붙이면 된다.

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

배열을 명시적으로 푼다는 점을 이용해 배열에 들어있는 값과 다른 여러 값을 함께 묶어 가변 인자로 넘길 수 있다는 장점이 있다.

중위 호출과 구조 분해 선언

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

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

따라서 1 to "one"은 아래와 같다.

1.to("one")

어떤 함수가 중위 호출이 가능하도록 허용하고 싶으면 infix 변경자를 함수 선언 앞에 추가하면 된다.

public infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that)

여기서 Pair는 두 원소로 이뤄진 순서쌍을 표현한다. Pair의 두 원소로 두 변수를 즉시 초기화할 수 있다.

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

이 기능을 구조 분해 선언(restructuring declaration)이라고 한다.

Pair 외에도 다른 객체에도 구조 분해를 적용할 수 있다(ex. key, value 쌍).

루프에서도 활용할 수 있다. withIndex를 구조 분해 선언과 조합하면 컬렉션 원소와 인덱스 값을 따로 변수에 담을 수 있다.

for ((index, element) in collection.withIndex()) { ... }

문자열과 정규식 다루기

코틀린 문자열은 자바 문자열과 같다. 어떤 경우에도 잘 작동하며 특별한 변환도 필요 없고, 자바 문자열을 감싸는 별도의 wrapper도 생기지 않는다. 코틀린은 다양한 확장 함수를 제공해서 자바 문자열을 더 다루기 편하게 해준다.

문자열 나누기

자바 String의 split 메소드는 개발자 입장에서 혼동을 일으킬 수 있는 요소가 있다. 바로 split의 구분 문자열은 정규식으로 작동한다는 것이다. 이로 인해

"12.345-6.A".split(".")

이 의도와는 다르게 빈 배열을 반환하는 결과를 불러일으킨다.

코틀린은 여러 다른 조합의 파라미터를 받는 split 확장 함수를 제공하여 혼동을 일으키는 메소드를 감춘다.

  1. 정규식을 파라미터로 받는 split 함수는 Regex 타입의 값을 받는다.
"12.345-6.A".split("\\.|-".toRegex()) //[12, 345, 6, A]

코틀린은 toRegex 확장 함수를 이용해 문자열을 정규식으로 변환할 수 있다.

  1. 구분 문자열을 하나 이상 받을 수 있다.
"12.345-6.A".split('.', '-') //[12, 345, 6, A]

이 확장 함수는 자바에 있는 단 하나의 문자만 받을 수 있는 메소드를 대신한다.

3중 따옴표 문자열

3중 따옴표 문자열은 보통

  1. 문자열 이스케이프를 피하기 위해
  2. 줄 바꿈을 그대로 넣기 위해

사용한다.

문자열 이스케이프의 경우 정규식을 사용할 때 유용하다.

"(.+)/(.+)\\.(.+)"
"""(.+)/(.+)\.(.+)"""

3중 따옴표를 사용하여 마침표 기호를 이스케이프할 수 있다. (\\. -> \.)

또한 삼중 따옴표는 줄 바꿈을 표현하는 아무 문자열이나 그대로 들어간다. 이를 이용해 문자열을 보여주는 그대로 표현할 수도 있다.

val kotlinLogo = """|  //
                                .| //
                                .|/ \
""".trimMargin(".")
println(kotlinLogo)

문자열을 있는 그대로 표현하기 때문에 IDE의 들여쓰기도 그대로 표기한다. 이를 막기 위해 들여쓰기의 끝부분을 특별한 문자열로 표시하고(위는 .으로 표시), trimMargin(특별한 문자열)을 이용해서 들여쓰기로 인한 공백을 제거할 수 있다.

3중 따옴표는 문자열 템플릿과 사용할 때 $ 문자를 이스케이프 할 수 없기 때문에 $를 그대로 사용할 수 없다. 이를 해결하려면 ${'$'}로 문자열 템플릿 안에 '$' 문자를 넣어야 한다.


© 2021. All rights reserved.

Powered by Hydejack v9.1.6