Kotlin 코딩테스트 문법 시리즈 ② : 문자열 (String)

2025. 7. 2. 01:27·Code Odyssey

✅ 이 문서는 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
'Code Odyssey' 카테고리의 다른 글
  • Kotlin 코딩테스트 문법 시리즈 ④ : 배열(Array) 정리
  • Kotlin 코딩테스트 문법 시리즈 ③ : 입출력 & 조건문 & 반복문 정리
  • Kotlin 코딩테스트 문법 시리즈 ① : 기본 자료형 & 변수
  • Map<String, Integer> dp 는 시간초과가 나는 이유 : 프로그래머스 - 사칙연산
Celion
Celion
오늘도 평소처럼 화이팅!
  • Celion
    Orion Log
    Celion
  • 전체
    오늘
    어제
    • 전체 글 (144)
      • Uncompiled Thoughts (8)
        • 네이버 부스트캠프 10기 (5)
      • CS 기초부터 한 걸음씩 (34)
      • Code Odyssey (22)
      • Algorithm (77)
        • Coding Test Records (63)
      • Git (3)
      • reference (0)
  • 블로그 메뉴

    • 태그
    • 방명록
  • 태그

    Kotlin
    Level3
    백준
    greedy
    알고리즘고득점kit
    코테
    java
    시뮬레이션
    문법정리
    프로그래머스
    boostcamp
    Level2
  • 최근 글

  • 인기 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.4
Celion
Kotlin 코딩테스트 문법 시리즈 ② : 문자열 (String)
상단으로

티스토리툴바