본문 바로가기
  • 개발하는 곰돌이
Programming Language/Kotlin & Java

Kotlin 기본 문법 3 : String

by 개발하는 곰돌이 2022. 11. 21.

목차

    개요

    Kotlin의 String 클래스는 Java와 몇가지 차이점이 있다. 이번 포스트에서는 이전 포스트에서 간단하게만 소개했던 Kotlin의 String 클래스에 대해 더 정리하고자 한다.


    문자열의 동등 비교

    Kotlin에서는 Java와 달리 == 연산자를 이용하여 문자열의 값이 같은지 비교할 수 있다. Kotlin 문자열에서의 ==는 Java String 클래스의 equals() 메소드와 같은 역할을 한다. 물론 Kotlin에서도 equals() 메소드를 이용하여 두 문자열이 같은지 비교할 수 있지만 == 연산자를 사용하는 것을 권장하고 있다.

    Java에서 문자열의 대소문자를 무시하고 비교하려면 equalsIgnoreCase()라는 별도의 메소드를 사용해야 하는 것과 달리 Kotlin에서는 equlas() 메소드의 파라미터로 비교할 문자열과 함께 true를 전송하면 두 문자열의 대소문자를 무시하고 비교할 수 있다.

    만약 Java에서의 ==처럼 문자열의 참조 주소를 비교하고 싶다면 === 연산자를 사용하여 비교할 수 있다.

    val str1 = "Hello"
    val str2 = "HELLO"
    // Kotlin에서는 String 클래스의 생성자에 리터럴을 입력하는 것으로는 문자열 선언 불가능
    val str3 = String(StringBuilder("Hello"))
    
    println(str1 == str3)	// 문자열의 내용이 같으므로 true 출력
    println(str1.equals(str2, true)	// 대소문자를 무시하고 비교하여 true 출력
    println(str1 === str3)	// 문자열의 주소값이 다르므로 false 출력

    위 코드를 Java로 표현하면 아래와 같다.

    String str1 = "Hello";
    String str2 = "HELLO";
    String str3 = new String("Hello");
    
    System.out.println(str1.equals(str3));	// true
    System.out.println(str1.equalsIgnoreCase(str2));	// true
    System.out.println(str1 == str3);	// false

    문자열의 사전순 비교

    Kotlin에서는 두 문자열 중 어느것이 사전순으로 앞서는지만 비교하고 싶을 경우엔 간단히 부등호만 이용해서 비교가 가능하다. Java에서는 반드시 String.compareTo() 메소드의 결과값을 통해 두 문자열의 사전순 비교를 해야했던 것에 비하면 매우 간단해졌다. 이 때, String.compareTo() 메소드와 마찬가지로 작은 쪽이 사전순서 상 앞선다.

    val str1 = "abcd"
    val str2 = "abce"
    
    println("abcd는 abce보다 사전순으로 앞섭니다 : " + (str1 < str2))	// true
    println("abcd는 abce보다 사전순으로 앞서지 않습니다 : " + (str1 > str2))	// false

    문자열 템플릿

    Kotlin에서는 다른 객체들을 문자열에 합칠 때 + 연산자를 사용하는 대신 문자열 내부에 달러 표시($)와 중괄호를 이용하면 간단하게 표현할 수 있다. 이 경우, 객체 이름 바로 뒤에 공백이나 이스케이프 문자가 있으면 중괄호를 생략할 수 있다. 단, 클래스의 멤버 변수나 메소드, 수식은 반드시 중괄호로 감싸주어야 한다.

    // Java
    int a = 2;
    int b = 3;
    System.out.println(a + " + " + b + " = " + (a + b));	// 2 + 3 = 5
    System.out.println(a + "\t" + b);	// 2	3
    // Kotlin
    val a = 2
    val b = 3
    println("$a + $b = ${a + b}")	// 2 + 3 = 5
    println("$a\t$b")	// 2	3

    만약 식별자의 이름으로 사용될 수 있는 문자(알파벳이나 언더스코어) 바로 앞에 달러 표시를 쓰고 싶다면 다음과 같이 사용해야 한다.

    val str = "${'$'}abcd"
    
    println(str)	// $abcd

    특정 인덱스의 문자 가져오기

    Kotlin의 문자열이 갖는 특징 중 하나는 특정 인덱스의 문자를 가져올 때 charAt() 메소드를 사용할 필요가 없다는 점이다. Java에서는 어떤 문자열의 특정 인덱스에 있는 문자를 가져오려면 charAt() 메소드를 사용해야 했지만 Kotlin에서는 charAt() 메소드를 아예 지원하지 않고, 배열의 요소를 가져오듯이 대괄호 안에 인덱스 값만 넣어주면 된다.

    // Java
    String str = "Hello World"
    
    System.out.println(str.charAt(1));	// e
    // Kotlin
    val str = "Hello World"
    
    println(str[1])		// e

    문자열의 대소문자 변환

    Kotlin 문자열에서 대소문자의 변환은 uppercase()lowercase() 메소드로 할 수 있다. 이 두 메소드는 각각 Java의 toUpperCase()toLowerCase()와 내부적으로 완전히 동일한 메소드이다.

    StringsJVM.kt에 정의된 uppercase()와 lowercase(). 각각 Java의 String 클래스에 있는 toUpperCase()와 toLowerCase() 메소드를 그대로 호출한다.

    // Kotlin
    val str = "HeLlo"
    
    println(str.uppercase())	// "HELLO"
    println(str.lowercase())	// "hello"
    // Java
    String str = "HeLlo";
    
    System.out.println(str.toUpperCase());	// HELLO
    System.out.println(str.toLowerCase());	// hello

    문자열 잘라서 추출

    Kotlin에서 문자열을 잘라서 추출하는 방법으로는 substring() 메소드와 slice() 메소드가 있다. 이 중

    substring()은 Java와 내부적으로 동일한 메소드이고, slice()는 Collection 객체에서 일부를 추출하는 메소드이지만 문자열에서는 substring()과 비슷하게 동작한다.

    substring() 메소드는 Java의 substring() 메소드를 호출한다.

    substring() 메소드는 Java와는 달리 IntRange 객체를 파라미터로 보내는 것으로도 문자열을 잘라낼 수 있다. IntRange에 대해서는 조건문과 반복문 포스트에서 더 다루도록 하겠다.

    val str = "Hello World!"
    
    println(str.substring(3))		// lo World!
    println(str.substring(3, 7))		// lo W
    println(str.substring(3 until 7))	// lo W
    println(str.slice(3 until 7))		// lo W

    특정 문자를 기준으로 문자열 나누기

    Kotlin도 Java와 마찬가지로 split() 메소드를 이용하여 특정 문자를 기준으로 문자열을 나눌 수 있다. Java에서는 나눈 결과물을 String배열로 반환하지만 Kotlin에서는 List로 반환한다는 차이가 있다.

    Kotlin에서는 map 메소드를 이용하여 배열이나 리스트의 값을 한번에 다른 자료형으로 변환할 수 있다. 이를 이용하여 split() 메소드로 나눠진 문자열들을 Int형으로 받는 식의 동작도 가능하다.

    val a = "This is Kotlin.".split(" ")	// ["This", "is", "Kotlin."]
    // map은 소괄호를 사용하지 않고 중괄호 내부에 동작을 작성해야한다는 것에 유의
    val b = "123,456,789".split(",").map { it.toInt() }	// [123, 456, 789]

    마무리

    이번 포스트에서는 Kotlin의 문자열에 대해 정리해보았다.

     

    다음 포스트에서는 Kotlin의 조건문과 반복문에 대해 정리해보고자 한다.

     

    댓글 피드백은 언제나 환영합니다.

    댓글