✅ 이 문서는 Kotlin에서 문자열을 다루는 법을 요약 정리한 것입니다. Python의 str, Java의 String을 이미 알고 있다면 빠르게 이해할 수 있습니다.
🔹 문자열 선언과 기본 조작
val s1: String = "Hello"
val s2 = "World" // 타입 생략 가능
val c: Char = 'A' // 문자는 Char 타입, 홑따옴표 사용
🔹 문자열 길이 및 인덱스 접근
val s = "Kotlin"
println(s.length) // 6
println(s[0]) // 'K'
🔹 부분 문자열 (substring)
val s = "abcdef"
println(s.substring(1, 4)) // "bcd" (1번 인덱스부터 4 전까지)
🔹 부분 문자열 추출 (substringBefore, substringAfter 등)
val path = "/usr/bin/java"
println(path.substringBefore("/")) // "" (앞에서 첫 '/' 전까지)
println(path.substringAfter("/")) // "usr/bin/java"
println(path.substringBeforeLast("/")) // "/usr/bin" (마지막 '/' 전까지)
println(path.substringAfterLast("/")) // "java" (마지막 '/' 뒤부터)
substringBefore,substringAfter: 앞에서부터 첫 구분자 기준substringBeforeLast,substringAfterLast: 뒤에서부터 마지막 구분자 기준- 구분자가 없으면:
substringBefore는 전체 반환substringAfter는 빈 문자열 반환
🔹 문자열 자르기 (슬라이싱 유사)
val s = "abcdef"
println(s.take(3)) // "abc" (앞 3글자)
println(s.drop(2)) // "cdef" (앞 2글자 제외)
println(s.takeLast(2)) // "ef" (뒤 2글자)
println(s.dropLast(1)) // "abcde" (마지막 글자 제외)
take(n): 앞에서 n개 추출drop(n): 앞에서 n개 버림takeLast(n)/dropLast(n): 뒤에서 동작
🔹 문자열 반복 및 합치기
println("A".repeat(3)) // "AAA"
println("Hello" + " Kotlin") // "Hello Kotlin"
🔹 문자열 비교
val a = "apple"
val b = "Apple"
println(a == b) // false (대소문자 구분)
println(a.equals(b, true)) // true (대소문자 무시 비교)
🔹 문자열 포함 여부, 시작/끝
val s = "kotlin is fun"
s.contains("is") // true
s.startsWith("kot") // true
s.endsWith("fun") // true
🔹 문자열 분할 & 합치기
val s = "a,b,c"
val parts = s.split(",") // ["a", "b", "c"]
val joined = parts.joinToString("-") // "a-b-c"
split()은 기본적으로List<String>을 반환joinToString()은 List를 다시 문자열로 병합
🔹 문자열 -> 문자 리스트, 아스키 코드
val s = "abc"
val chars = s.toList() // ['a', 'b', 'c']
val codes = s.map { it.code } // [97, 98, 99]
Char.code는 아스키 코드값(Int) 반환toList()는 문자열 →List<Char>로 분해
🔹 아스키 코드 → 문자 변환
val c = (97 + 1).toChar() // 'b'
val ch = 97.toChar() // 'a'
Int.toChar()을 사용해 아스키 코드 → 문자로 변환 가능Char.code와 반대 방향 변환
🔹 문자열 공백 제거
val raw = " hello world "
val trimmed = raw.trim() // "hello world"
val noSpaces = raw.replace(" ", "") // "helloworld"
trim(): 앞뒤 공백 제거replace(" ", ""): 모든 공백 제거
🔹 문자열 정렬
val sorted = "dcba".toList().sorted().joinToString("")
println(sorted) // "abcd"
🔹 문자열 뒤집기
val s = "kotlin"
val reversed = s.reversed() // "niltok"
.reversed()는 문자열을 반대로 뒤집음- 문자열을 뒤에서부터 처리해야 할 때 자주 사용
🔹 문자열 감싸기 제거 (removeSurrounding)
val s = "<tag>"
println(s.removeSurrounding("<", ">")) // "tag"
- 지정한 문자열이 앞뒤에 있을 경우만 제거
- HTML 태그 제거, 괄호 감싸기 제거 등에 유용
🔹 접두사 / 접미사 제거 (removePrefix, removeSuffix)
val word = "unhappy"
val past = "failed"
println(word.removePrefix("un")) // "happy"
println(past.removeSuffix("ed")) // "fail"
- 정확히 해당 문자열이 앞/뒤에 있을 경우만 제거됨
🔹 문자열 치환 (replace)
val s = "aabbaacc"
println(s.replace("aa", "XX")) // "XXbbXXcc"
- 지정한 문자열을 모두 다른 문자열로 치환
🔹 정규식 기반 치환 (replace(Regex, transform))
val s = "ID:123, Name:Tom"
val result = s.replace(Regex("\\d+")) { matchResult ->
"[${matchResult.value}]"
}
println(result) // "ID:[123], Name:Tom"
- 정규식을 활용해 동적으로 치환 가능
- 변환 대상이 많을 때 유용
🔹 문자열 패딩 (padStart, padEnd)
val n = "7"
println(n.padStart(3, '0')) // "007"
println(n.padEnd(5, '.')) // "7...."
- 문자열 길이를 맞추기 위해 앞/뒤에 특정 문자로 채움
- 좌우 정렬할 때 자주 사용됨
🔹 문자 판별 (숫자, 알파벳, 대소문자 여부)
val ch = 'A'
println(ch.isDigit()) // false
println(ch.isLetter()) // true
println(ch.isUpperCase()) // true
println(ch.isLowerCase()) // false
isDigit(): 숫자 여부 (0~9)isLetter(): 알파벳 여부 (az,AZ)isUpperCase()/isLowerCase(): 대소문자 판별
문자열을 순회하며 문자 성격에 따라 분기 처리할 때 필수
✅ 문자 대소문자 반전
val input = readLine()!!
val result = input.map {
if (it.isUpperCase()) it.lowercaseChar() else it.uppercaseChar()
}.joinToString("")
println(result)
✅ 요약 정리
| 분류 | 함수 | 설명 | 예시 |
|---|---|---|---|
| 선언/접근 | val s = "text"val c = 'A' |
문자열/문자 선언 | val s: String = "hi" |
s[i], s.length |
인덱싱, 길이 확인 | s[0], s.length |
|
| 부분 문자열 | substring(start, end) |
시작~끝 이전까지 | "abc".substring(1,3) → "bc" |
substringBefore(".") |
첫 "." 앞까지 | "a.b".substringBefore(".") → "a" |
|
substringAfter("/") |
첫 "/" 이후 | "/a/b".substringAfter("/") → "a/b" |
|
substringBeforeLast(".") |
마지막 "." 앞까지 | "a.b.c".substringBeforeLast(".") → "a.b" |
|
substringAfterLast("/") |
마지막 "/" 이후 | "/a/b".substringAfterLast("/") → "b" |
|
| 슬라이싱 유사 | take(n) / drop(n) |
앞에서 n개 추출/제거 | "abc".take(2) → "ab" |
takeLast(n) / dropLast(n) |
뒤에서 n개 추출/제거 | "abc".dropLast(1) → "ab" |
|
| 합치기/반복 | + / repeat(n) |
문자열 연결, 반복 | "Hi" + "!" → "Hi!", "a".repeat(3) → "aaa" |
| 비교 | ==, equals(ignoreCase = true) |
값 비교 / 대소문자 무시 비교 | "a" == "A" → false, "a".equals("A", true) → true |
| 포함/시작/끝 | contains("is")startsWith("a")endsWith("z") |
포함 여부 및 시작/끝 체크 | "abc".contains("b") → true |
| 분할/병합 | split(",") / joinToString("-") |
리스트로 나누기, 합치기 | "a,b".split(",") → [a, b] |
| 문자 리스트 변환 | toList() |
String → List<Char> |
"abc".toList() → [a, b, c] |
| 아스키 변환 | Char.code / Int.toChar() |
아스키 변환 | 'a'.code → 97, 97.toChar() → 'a' |
| 공백 제거 | trim() / replace(" ", "") |
앞뒤 공백 / 전체 공백 제거 | " a ".trim() → "a" |
| 정렬/뒤집기 | toList().sorted() / reversed() |
정렬, 역순 정렬 | "cab".reversed() → "bac" |
| 감싸기 제거 | removeSurrounding("(", ")") |
양쪽 감싸는 문자열 제거 | "(a)".removeSurrounding("(", ")") → "a" |
| 접두/접미 제거 | removePrefix("un")removeSuffix("ed") |
접두사/접미사 제거 | "unhappy".removePrefix("un") → "happy" |
| 치환 | replace("a", "b") |
문자열 전체 치환 | "aa".replace("a","b") → "bb" |
| 정규식 치환 | replace(Regex, transform) |
패턴 기반 치환 | "a1".replace(\\d){ "X" } → "aX" |
| 패딩 | padStart(n, '0') / padEnd(n, '.') |
지정 문자로 채워 길이 맞춤 | "7".padStart(3, '0') → "007" |
| 문자 판별 | isDigit(), isLetter()isUpperCase(), isLowerCase() |
숫자/문자/대소문자 판별 | 'A'.isLetter() → true |
- 실전 자주 등장 기능:
- 문자열 분해
- 정렬 (sorted), 역순 (reversed)
- 대소문자 변환 (isUpperCase, lowercaseChar()) 등
다음은 시리즈 ③: 입출력 & 조건문 & 반복문 정리로 이어집니다.
'Code Odyssey' 카테고리의 다른 글
| Kotlin 코딩테스트 문법 시리즈 ④ : 배열(Array) 정리 (1) | 2025.07.04 |
|---|---|
| Kotlin 코딩테스트 문법 시리즈 ③ : 입출력 & 조건문 & 반복문 정리 (1) | 2025.07.03 |
| Kotlin 코딩테스트 문법 시리즈 ① : 기본 자료형 & 변수 (0) | 2025.07.01 |
| Map<String, Integer> dp 는 시간초과가 나는 이유 : 프로그래머스 - 사칙연산 (1) | 2025.06.11 |
| 왜 Java는 length, length(), size()를 따로 써야 할까? – 통일 안 된 이유 (1) | 2025.06.06 |