Skip to content

Java 및 Kotlin의 문자열

이 가이드는 Java 및 Kotlin에서 문자열로 일반적인 작업을 수행하는 방법에 대한 예시를 포함합니다. Java에서 Kotlin으로 마이그레이션하고 코드를 진정한 Kotlin 방식으로 작성하는 데 도움이 될 것입니다.

문자열 연결

Java에서는 다음과 같이 수행할 수 있습니다:

java
// Java
String name = "Joe";
System.out.println("Hello, " + name);
System.out.println("Your name is " + name.length() + " characters long");

Kotlin에서는 문자열에 변수 값을 보간하기 위해 변수 이름 앞에 달러 기호($)를 사용합니다:

kotlin
fun main() {
    // Kotlin
    val name = "Joe"
    println("Hello, $name")
    println("Your name is ${name.length} characters long")
}

복잡한 표현식의 값을 ${name.length}와 같이 중괄호로 둘러싸 보간할 수 있습니다. 자세한 내용은 문자열 템플릿을 참조하세요.

문자열 빌드

Java에서는 StringBuilder를 사용할 수 있습니다:

java
// Java
StringBuilder countDown = new StringBuilder();
for (int i = 5; i > 0; i--) {
    countDown.append(i);
    countDown.append("
");
}
System.out.println(countDown);

Kotlin에서는 문자열을 구성하는 로직을 람다 인수로 취하는 인라인 함수buildString()을 사용합니다:

kotlin
fun main() {
       // Kotlin
       val countDown = buildString {
           for (i in 5 downTo 1) {
               append(i)
               appendLine()
           }
       }
       println(countDown)
}

내부적으로는 buildString이 Java와 동일한 StringBuilder 클래스를 사용하며, 람다 내부에서 암시적 this를 통해 접근합니다.

람다 코딩 컨벤션에 대해 자세히 알아보세요.

컬렉션 항목에서 문자열 생성

Java에서는 Stream API를 사용하여 항목을 필터링하고, 매핑하고, 수집합니다:

java
// Java
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6);
String invertedOddNumbers = numbers
        .stream()
        .filter(it -> it % 2 != 0)
        .map(it -> -it)
        .map(Object::toString)
        .collect(Collectors.joining("; "));
System.out.println(invertedOddNumbers);

Kotlin에서는 모든 List에 대해 Kotlin이 정의하는 joinToString() 함수를 사용합니다:

kotlin
fun main() {
    // Kotlin
    val numbers = listOf(1, 2, 3, 4, 5, 6)
    val invertedOddNumbers = numbers
        .filter { it % 2 != 0 }
        .joinToString(separator = ";") {"${-it}"}
    println(invertedOddNumbers)
}

NOTE

Java에서 구분 기호와 다음 항목 사이에 공백을 두려면 구분 기호에 공백을 명시적으로 추가해야 합니다.

joinToString() 사용법에 대해 자세히 알아보세요.

문자열이 비어 있으면 기본값 설정

Java에서는 삼항 연산자를 사용할 수 있습니다:

java
// Java
public void defaultValueIfStringIsBlank() {
    String nameValue = getName();
    String name = nameValue.isBlank() ? "John Doe" : nameValue;
    System.out.println(name);
}

public String getName() {
    Random rand = new Random();
    return rand.nextBoolean() ? "" : "David";
}

Kotlin은 기본값을 인수로 받는 인라인 함수 ifBlank()를 제공합니다:

kotlin
// Kotlin
import kotlin.random.Random

fun main() {
    val name = getName().ifBlank { "John Doe" }
    println(name)
}

fun getName(): String =
    if (Random.nextBoolean()) "" else "David"

문자열의 시작과 끝에 있는 문자 바꾸기

Java에서는 replaceAll() 함수를 사용할 수 있습니다. 이 경우 replaceAll() 함수는 각각 ##로 시작하고 끝나는 문자열을 정의하는 정규 표현식 ^####$를 인수로 받습니다:

java
// Java
String input = "##place##holder##";
String result = input.replaceAll("^##|##$", "");
System.out.println(result);

Kotlin에서는 문자열 구분 기호 ##와 함께 removeSurrounding() 함수를 사용합니다:

kotlin
fun main() {
    // Kotlin
    val input = "##place##holder##"
    val result = input.removeSurrounding("##")
    println(result)
}

문자열 내 모든 일치하는 부분 바꾸기

Java에서는 PatternMatcher 클래스를 사용하여, 예를 들어 일부 데이터를 난독화할 수 있습니다:

java
// Java
String input = "login: Pokemon5, password: 1q2w3e4r5t";
Pattern pattern = Pattern.compile("\\w*\\d+\\w*");
Matcher matcher = pattern.matcher(input);
String replacementResult = matcher.replaceAll(it -> "xxx");
System.out.println("Initial input: '" + input + "'");
System.out.println("Anonymized input: '" + replacementResult + "'");

Kotlin에서는 정규 표현식 작업을 단순화하는 Regex 클래스를 사용합니다. 또한 백슬래시 수를 줄여 정규식 패턴을 단순화하려면 여러 줄 문자열을 사용하세요:

kotlin
fun main() {
    // Kotlin
    val regex = Regex("""\w*\d+\w*""") // multiline string
    val input = "login: Pokemon5, password: 1q2w3e4r5t"
    val replacementResult = regex.replace(input, replacement = "xxx")
    println("Initial input: '$input'")
    println("Anonymized input: '$replacementResult'")
}

문자열 분할

Java에서 마침표 문자(.)로 문자열을 분할하려면 이스케이프(\\)를 사용해야 합니다. 이는 String 클래스의 split() 함수가 정규 표현식을 인수로 받기 때문입니다:

java
// Java
System.out.println(Arrays.toString("Sometimes.text.should.be.split".split("\\.")));

Kotlin에서는 구분 기호의 가변 인수를 입력 매개변수로 받는 Kotlin 함수 split()를 사용합니다:

kotlin
fun main() {
    // Kotlin
    println("Sometimes.text.should.be.split".split("."))
}

정규 표현식으로 분할해야 하는 경우, Regex를 매개변수로 받는 오버로드된 split() 버전을 사용하세요.

부분 문자열 가져오기

Java에서는 부분 문자열을 가져올 시작 문자의 포함(inclusive) 인덱스를 인수로 받는 substring() 함수를 사용할 수 있습니다. 이 문자 뒤의 부분 문자열을 가져오려면 인덱스를 1 증가시켜야 합니다:

java
// Java
String input = "What is the answer to the Ultimate Question of Life, the Universe, and Everything? 42";
String answer = input.substring(input.indexOf("?") + 1);
System.out.println(answer);

Kotlin에서는 substringAfter() 함수를 사용하며, 부분 문자열을 가져올 문자 뒤의 인덱스를 계산할 필요가 없습니다:

kotlin
fun main() {
    // Kotlin
    val input = "What is the answer to the Ultimate Question of Life, the Universe, and Everything? 42"
    val answer = input.substringAfter("?")
    println(answer)
}

또한 문자의 마지막 발생 이후의 부분 문자열을 가져올 수 있습니다:

kotlin
fun main() {
    // Kotlin
    val input = "To be, or not to be, that is the question."
    val question = input.substringAfterLast(",")
    println(question)
}

여러 줄 문자열 사용

Java 15 이전에는 여러 줄 문자열을 생성하는 여러 가지 방법이 있었습니다. 예를 들어, String 클래스의 join() 함수를 사용하는 방법입니다:

java
// Java
String lineSeparator = System.getProperty("line.separator");
String result = String.join(lineSeparator,
       "Kotlin",
       "Java");
System.out.println(result);

Java 15에서는 텍스트 블록이 도입되었습니다. 한 가지 유의할 점은 다음과 같습니다: 여러 줄 문자열을 출력할 때 삼중 따옴표가 다음 줄에 있으면 빈 줄이 추가됩니다:

java
// Java
String result = """
    Kotlin
       Java
    """;
System.out.println(result);

출력:

Java 15 multiline output

삼중 따옴표를 마지막 단어와 같은 줄에 두면 이러한 동작 차이가 사라집니다.

Kotlin에서는 따옴표를 새 줄에 두어 줄을 포맷할 수 있으며, 출력에 빈 줄이 추가되지 않습니다. 모든 줄의 가장 왼쪽 문자가 줄의 시작을 식별합니다. Java와의 차이점은 Java는 자동으로 들여쓰기를 제거하지만, Kotlin에서는 명시적으로 수행해야 한다는 것입니다:

kotlin
fun main() {
    // Kotlin   
    val result = """
        Kotlin
           Java 
    """.trimIndent()
    println(result)
}

출력:

Kotlin multiline output

빈 줄을 추가하려면 여러 줄 문자열에 이 빈 줄을 명시적으로 추가해야 합니다.

Kotlin에서는 trimMargin() 함수를 사용하여 들여쓰기를 사용자 지정할 수도 있습니다:

kotlin
// Kotlin
fun main() {
    val result = """
       #  Kotlin
       #  Java
   """.trimMargin("#")
    println(result)
}

여러 줄 문자열에 대해 자세히 알아보세요.

다음 단계는?

좋아하는 이디엄이 있다면 풀 리퀘스트를 보내 공유해 주시기 바랍니다.