프로그래밍의 시작과 끝은 입출력이고, 그 중심에는 항상 문자열(String)이 있습니다. 특히 알고리즘 문제 풀이나 콘솔 애플리케이션 개발(우아한테크코스 미션 등)에서 문자열을 얼마나 능숙하게 다루느냐는 코딩 속도와 가독성을 결정짓는 중요한 요소입니다.
코틀린은 자바의 장황한 문자열 처리 방식을 획기적으로 개선했습니다. 오늘은 코틀린의 문자열 처리 기법과 성능을 고려한 최적화 방법까지 깊게 알아보겠습니다.

1. String Template: `+` 연산자와의 이별
자바에서는 변수와 문자열을 합치기 위해 `+` 연산자를 남발했습니다. `String msg = "이름: " + name + ", 나이: " + age;` 이는 가독성을 떨어뜨릴 뿐만 아니라, 실수할 여지를 만듭니다.
코틀린의 String Template(`$`)은 내부적으로 `StringBuilder`를 사용하여 효율적이고 직관적인 문자열 조합을 지원합니다.
val name = "Kim"
val height = 180.5
// 1. 단순 변수 매핑
println("이름: $name")
// 2. 표현식 사용 (중괄호 필수)
// 복잡한 연산이나 함수 호출은 반드시 ${}로 감싸야 합니다.
println("이름의 길이: ${name.length}")
println("키 + 10cm: ${height + 10}")
Tip: 단순 변수라도 `${name}`처럼 항상 중괄호를 쓰는 컨벤션을 가진 팀도 있습니다. 이는 추후 변수명이 바뀌거나 뒤에 텍스트가 붙을 때의 리팩토링 안전성을 높여줍니다.
2. joinToString: 반복문 없이 컬렉션 출력하기
리스트의 내용을 `[1, 2, 3]` 처럼 예쁘게 출력하고 싶을 때, 초보자들은 `for`문을 돌리며 `StringBuilder`에 `append`를 합니다. 하지만 코틀린 개발자라면 `joinToString`을 써야 합니다.
이 함수는 내부적으로 `Appendable`을 사용하여 매우 최적화된 반복을 수행합니다.
val numbers = listOf(1, 2, 3, 4, 5)
// 커스텀 포맷팅의 끝판왕
val result = numbers.joinToString(
separator = " -> ", // 구분자
prefix = "<Start> ", // 접두사
postfix = " <End>", // 접미사
limit = 3, // 3개까지만 출력
truncated = "...more" // 잘렸을 때 표시할 문구
) { "Number:$it" } // transform 람다 (각 원소를 변형)
// 출력: <Start> Number:1 -> Number:2 -> Number:3 -> ...more <End>
이 함수 하나만 잘 알아도 알고리즘 출력 문제의 90%는 해결됩니다.
3. 여러 줄 문자열 (Triple Quotes)
SQL 쿼리나 JSON, 혹은 긴 에러 메시지를 작성할 때 `\n`을 계속 넣는 것은 고역입니다. 코틀린은 따옴표 3개(`"""`)로 이를 해결합니다.
val menu = """
1. 게임 시작
2. 게임 종료
3. 옵션
""".trimIndent()
- `trimIndent()`: 코드상의 들여쓰기 공백을 자동으로 제거해 줍니다.
- `trimMargin()`: 특정 문자(`|`)를 기준으로 들여쓰기를 제거합니다.
4. 성능 이야기: String vs StringBuilder
코틀린의 `String`은 자바와 마찬가지로 불변(Immutable)입니다. 즉, 문자열을 수정할 때마다 새로운 객체가 힙 메모리에 생성됩니다.
// [BAD] 반복문 안에서 문자열 더하기 (메모리 낭비 심함)
var str = ""
for (i in 0..10000) {
str += i // 매번 새로운 String 객체 생성 및 복사 발생 (O(N^2))
}
// [GOOD] StringBuilder 사용 (O(N))
val sb = StringBuilder()
for (i in 0..10000) {
sb.append(i)
}
val result = sb.toString()
코틀린에서는 `buildString`이라는 멋진 고차 함수를 제공하여 `StringBuilder`를 더 우아하게 쓸 수 있게 해줍니다.
val result = buildString {
append("Hello, ")
append("World!")
// this는 StringBuilder 객체
}
5. 정리
- 간단한 출력은 String Template (`$`)을 사용하세요.
- 컬렉션을 예쁘게 출력할 땐 `joinToString`을 애용하세요.
- 여러 줄 텍스트는 `"""` (Triple Quotes)가 답입니다.
- 반복문이나 잦은 문자열 조작이 필요할 땐 `StringBuilder`나 `buildString`을 사용해 성능을 챙기세요.
문자열을 잘 다루는 것은 단순히 코드를 예쁘게 짜는 것을 넘어, 프로그램의 성능을 좌우하는 기본기입니다.
'Dev Log > Kotlin' 카테고리의 다른 글
| [Kotlin] static은 잊어라, Companion Object(동반 객체)의 모든 것 (1) | 2026.01.04 |
|---|---|
| [Kotlin] 컬렉션(Collection) 마스터하기: List, Set, Map 그리고 Sequence의 성능 차이 (3) | 2026.01.04 |
| [Kotlin] 클래스의 품격: data class와 enum class 내부 동작 원리부터 실무 활용까지 (0) | 2026.01.04 |
| [Kotlin] 함수를 변수처럼? 고차함수와 더블 콜론(::) 완벽 이해하기 (1) | 2026.01.04 |
| [Kotlin] 견고한 코드 만들기: require와 check를 활용한 방어적 프로그래밍 (0) | 2026.01.04 |