코틀린에는 문자열(String)을 편리하게 다룰 수 있게 도와주는 기능들이 많이 있는데, 그 중 자주 사용하는 몇 가지에 대해 알아보겠습니다.

문자열 템플릿

문자열 템플릿은 문장 내 일부 단어만 상황에 따라 치환이 필요한 경우 사용합니다.

자바에서는 문자열 템플릿을 사용하기 위해 String.format() 메서드를 사용하며, 문장 내 삽입될 자료의 형태에 따라 각각 다른 형태의 치환자를 사용해야 합니다.

다음은 자바에서 문자열 템플릿을 사용하는 예를 보여줍니다.

void greet(String name) {
    // 문자열 출력을 위해 %s 치환자 사용
    System.out.println(String.format("Hello, %s", name));
}

void add(int a, int b) {
    // 정수형 출력을 위해 %d 치환자 사용
    System.out.println(String.format("%d + %d is %d", a, b, a + b));
}

// "Hello, Hana Song" 출력
greet("Hana Song");

// "1 + 3 is 4" 출력
add(1, 3);

앞의 예제의 경우, 템플릿에 넣을 인자의 수가 많지 않아 혼동의 여지가 적습니다.

하지만, 실제 프로젝트에서는 변수 자체의 이름이 길어지거나 인자의 개수가 많아지게 되면 혼동으로 인해 인자를 올바르게 대입하지 못하는 경우가 생깁니다.

코틀린에서는 템플릿 문장 내에 인자를 $를 사용하여 직접 대입함으로써 혼란을 상당히 줄일 수 있습니다.

다음은 앞의 자바 예제와 동일한 기능을 코틀린으로 작성한 예를 보여줍니다.

fun greet(name: String) {
    // 값 name을 직접 문자열 내에 대입합니다.
    System.out.println("Hello, $name")
}

fun add(a: Int, b: Int) {
    // 값 a, b와 a + b의 계산값을 대입합니다.
    // 표현식을 사용하는 경우 '$'기호와 중괄호를 함께 사용합니다.
    System.out.println("$a + $b is ${a + b}")
}

// "Hello, Hana Song" 출력
greet("Hana Song")

// "1 + 3 = 4" 출력
add(1, 3)

함수의 반환값을 대입하는 경우에도 표현식과 동일하게 중괄호를 사용합니다. 다음은 앞의 예제에서 인자로 받은 문자열의 hashCode를 추가로 출력하는 예를 보여줍니다.

fun greet(name: String) {
    System.out.println("Hello, $name. Your hashCode is ${name.hashCode()}.")
}

여러 줄로 구성된 문자열 선언

코드 내에 여러 줄로 구성된 문자열을 정의하는 경우, 자바에서는 주로 다음과 같은 형태로 문장을 조합하여 구성합니다.

String heroes = "D.Va\n"
            + "Lucio\n"
            + "Mercy\n"
            + "Soldier: 76\n";

코드에서 볼 수 있듯이, 자바에서는 각 문자열을 조합하기 위해 +기호를 사용하고, 개행 문자열도 별도로 넣어주어야 합니다.

코틀린에서는 """으로 문장의 앞과 뒤를 감싸기만 하면 개행이나 공백을 포함한 모든 문자를 자유롭게 사용할 수 있습니다.

다음은 앞의 코드를 코틀린으로 작성한 예를 보여줍니다.

val heroes = """
D.va
Lucio
Mercy
Soldier: 76
"""

하지만, """ 내에 작성하는 내용을 여과 없이 그대로 대입하다 보니 함수 내와 같이 블록으로 구분되는 부분에서 사용하면 다음과 같이 코드의 가독성이 떨어지게 됩니다.

fun foo() {
    val heroes = """
D.Va
Lucio
Mercy
Soldier: 76
"""

    // Other logics...
}

이런 경우, 각 줄의 시작을 구분할 문자(|) 앞을 공백으로 채운 후 trimMargin()을 사용하면 됩니다.

fun foo() {
    val heroes = """
        |D.Va
        |Lucio
        |Mercy
        |Soldier: 76
        """.trimMargin()

    // Other logics...
}

리스트로 구성된 자료를 하나의 문자열로 표현하기

리스트 내에 포함되어 있는 자료들을 구분자와 함께 하나의 문자열로 표현하는 경우, 코틀린 표준 라이브러리에 포함된 joinToString() 함수를 사용하면 편리합니다.

다음은 문자열 리스트에 저장된 내용을 하나의 문자열로 표시하는 예를 보여줍니다.

val items = listOf("D.Va", "Lucio", "Mercy", "Soldier: 76")

// "D.Va, Lucio, Mercy, Soldier: 76" 출력
System.out.println(items.joinToString())

각 항목을 구분하는 문자열을 변경하는 것도 가능합니다. 다음은 구분자로 -를 사용하는 예를 보여줍니다.

val items = listOf("D.Va", "Lucio", "Mercy", "Soldier: 76")

// "D.Va-Lucio-Mercy-Soldier: 76" 출력
System.out.println(items.joinToString("-"))

문자열이 아닌 다른 자료형의 리스트를 표현하는 경우, 다음과 같이 각 항목을 문자열로 변환하는 규칙을 추가로 지정하여 사용할 수 있습니다.

class HeroName(val firstName: String, val lastName: String)

val items = listOf(HeroName("Hana", "Song"), HeroName("Jack", "Morrison"))

// HeroName 클래스를 문자열로 변환하는 식을 추가합니다.
// "Hana Song, Jack Morrison" 출력
System.out.println(items.joinToString { "${it.firstName} ${it.lastName}" })

김태호 (Taeho Kim)

안드로이드와 오픈소스, 코틀린(Kotlin)에 관심이 많습니다. 현재 Google Developer Groups(GDG) Korea Android 운영자와 Google Developer Expert(GDE)로 활동하고 있습니다.

kunny Androidhuman


Published