Coding Memo

Kotlin 문자열 본문

Language/Kotlin

Kotlin 문자열

minttea25 2021. 1. 5. 17:40

Kotlin은 Java와 동일하게 문자열을 String 클래스로 사용한다.

마찬가지로 문자열에 대한 다양한 기본 함수들을 제공한다.

 

아래 링크는 String 클래스에 대한 공식 문서로, 속성과 함수들이 나와 있다.

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/

 

String - Kotlin Programming Language

 

kotlinlang.org

 

참고: String 클래스의 Init() 내용이 없다.

 

문자열을 만들 때는 단순히 "" 안에 값을 넣으면 문자열이 된다.

Kotlin에서 문자열 만들 때 특이한 점은 html처럼 """ (큰 따옴표 3개)를 이용해서 안의 내용 그대로 문자열로 사용이 가능하다.

 

연산자 '+'를 이용하여 Java처럼 문자열을 이어 붙일 수 있다.

fun main() {
    val a: String = "abcdefghijklmnopqrstuvwxyz"
    val b: String =
        """
A
P
P
L
E
        """

    val c: String = "I am "
    val d: String = "a student"
    println(a)
    println(b)
    println(c+d)
}

출력 결과


String 클래스 속성(Property) - length

 

공식 문서를 보면 String 클래스에는 기본 속성이 1개밖에 없지만 extension properties로 좀 더 있다.

(length, cstr, indices, lastIndex, utf16, utf32, utf8, wcstr)

속성이므로 함수로 취급해 '()'를 붙이지 말자.

 

이름만 봐도 알 수 있듯이 문자열의 길이를 Int 값으로 가지고 있다.

공식 문서의 length

fun main() {
    val a: String = "minttea25"

    println(a.length)
}

length 예시 출력 결과


String 관련 Functions

 

get

 

fun get(index: Int): Char

 

해당 인덱스에 있는 문자(Character)를 반환하는 함수이다.

fun main() {
    val a: String = "minttea25"

    println(a.get(5))
    println(a[5]) //위와 같은 값을 나타내지만 위의 경우보다는 이 경우로 쓰자
}

get 예시 출력 결과

참고: get을 사용하면 경고 문구가 나온다. (Should be replaced with indexing)

그냥 []로 쓰자.


subSequence

 

fun subSequence(startIndex: Int, endIndex: Int): CharSequence

 

서브 시퀀스를 반환하는 함수로 시작 인덱스와 끝 인덱스를 인자로 받는다.

(왜 단순히 반환 값이 String이 아니라 CharSequence라는 interface인지 궁금하다. 출력에는 특별한 점이 보이진 않는다.)

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-char-sequence/

fun main() {
    val a: String = "minttea25"

    println(a.subSequence(0, 7))
}

subSequence 예시 출력 결과


toLoserCase / toUpperCase

 

fun String.toLowerCase(locale: Locale): String

fun String.toUpperCase(locale: Locale): String

 

 

문자열을 모두 소문자/대문자로 바꾸어 반환해주는 함수이다.

fun main() {
    val a: String = "Kotlin.Java.Python"

    println(a.toLowerCase())
    println(a.toUpperCase())
}

toLowerCase toUpperCase 예시 출력 결과


joinToString

 

joinToString()

joinToString(문자열)

 

String 클래스에서만 제공하는 함수는 아니고 Collections에서 제공하는 함수이다.

Collections에 있는 값(문자열)들을 합쳐서 반환한다.

인자로 문자열(separator)을 넣으면 Collections에 있는 값 사이에 그 문자열을 넣고 합쳐서 반환한다.

fun main() {
    val a: List<String> = listOf("Apple", "is", "fruit")

    println(a.joinToString())
    println(a.joinToString(" "))
}

joinToString 예시 출력 결과


substring

 

fun String.substring(startIndex: Int)

fun String.subIndex(startIndex: Int, endIndex: Int)

fun String.substring(range: IntRange): String

 

subSequence랑 비슷하나 인자로 IntRange 타입을 사용할 수 있다.

IntRange 타입은 for문에서 했었던 반복 횟수로 지정했던 타입이다.

 

(시작값) .. (끝 값)

 

시작 값의 인덱스에서 끝 값의 인덱스 사이의 문자열을 반환한다. (마지막 인덱스를 포함하지 않음)

startIndex만 넣을 경우 문자열 끝의 인덱스까지 포함한 문자열을 반환한다.

fun main() {
    val a: String = "VideoGame"

    println(a.substring(1, 5))
    println(a.substring(1))
    println(a.substring(1..5))
}

substring 예시 출력 결과


split

 

fun CharSequence.split()

 

인자로 받은 문자열(구분자, delimiters) 또는 정규식으로 쪼개서 List<> 형태로 반환한다.

이 함수도 Java와 동일한 기능을 수행을 한다. 다만, 인자에 반드시 정규식이 있을 필요는 없다.

fun main() {
    val a: String = "Kotlin.Java.Python"

    for (n in a.split(".")) {
        println(n)
    }
}

split 예시 출력 결과


empty, blank, null

 

문자열이 empty, blank, null 일 때 관련한 다양한 함수들이 있다.

 

empty: 어떠한 문자도 포함하지 않음

blank: 오로지 공백 문자(space, tab, line feed, carriage return)만을 포함하거나 empty 임

null: null값

  definition explanation
isBlank fun CharSequence.isBlank(): Boolean 문자열이 blank면 true 반환
isEmpty fun CharSequence.isEmpty(): Boolean 문자열이 empty면 true 반환
isNotBlank fun CharSequence.isNotBlank(): Boolean 문자열이 blank가 아니라면 true 반환
isNotEmpty fun CharSequence.isNotEmpty(): Boolean 문자열이 empty가 아니라면 true 반환
isNullOrBlank fun CharSequence?.isNullOrBlank(): Boolean 문자열이 null이거나 blank일 경우 true 반환
isNullOrEmpty fun CharSequence?.isNullOrEmpty(): Boolean 문자열이 null이거나 empty일 경우 true 반환
fun main() {
    val arr:Array<String?> = arrayOf(null, "", " ", "\n", "1")

    for (n in arr) {
        println("$n")
        println("isBlank(): ${n?.isBlank()}")
        println("isEmpty(): ${n?.isEmpty()}")
        println("isNullOrBlank(): ${n.isNullOrBlank()}")
        println("isNullOrEmpty(): ${n.isNullOrEmpty()}")
        println()
    }
}

empty blank null 예시 출력 결과

"\n"과 " "는 같은 결과인 것을 확인할 수 있다.

 

참고: isNull() 함수는 있을 거 같지만 없다.

null 인지 확인하는 방법은 따로 있다. (?:, ?., !!.)

예시 구문에서도 null 값을 처리해주기 위해 사용했는데 아래 글을 참고하자.

(링크, 아직 미작성...)


startsWith / endsWith

 

fun CharSequence.startsWith(char: Char, ignoreCase: Boolean = false): Boolean

fun CharSequence.startsWith(prefix: CharSequence, ignoreCase: Boolean = false): Boolean

fun CharSequence.startsWith(prefix: CharSequence, startIndex: Int, ignoreCase: Boolean = false): Boolean

 

fun CharSequence.endsWith(char: Char, ignoreCase: Boolean = false): Boolean

fun CharSequence.endsWith(suffix: CharSequence, ignoreCase: Boolean = false): Boolean

 

 

인자로 받은 문자열로 시작하는지, 끝나는지 확인할 수 있는 함수이다.

fun main() {
    val a: String = "www.google.com"

    println(a.startsWith("www"))
    println(a.endsWith("com"))
}

startsWith endsWith 예시 출력 결과

참고: 인자에 있는 '='는 따로 값 지정 없을 시에 대입되는 default 값이다.


contains

 

operator fun CharSequence.contains(other: CharSequence, ignoreCase: Boolean = false): Boolean

operator fun CharSequence.contains(char: Char, ignoreCase: Boolean = false): Boolean

operator fun CharSequence.continas(regex: Regex): Boolean

 

해당 문자열이 포함되어있거나 정규식에 맞는 시퀀스가 있으면 true 반환

 

fun main() {
    val a: String = "www.google.com"

    println(a.contains("google"))
    println(a.contains(Regex(".([a-zA-Z0-9]+).")))
}

contains 예제


drop

 

fun String.drop(n: Int): String

 

n 번째에 있는 문자까지 지운 문자열을 반환한다.

(주의: index가 아니라 n번째이다! 따라서 1, 2, 3, ...로 시작한다.)

fun main() {
    var a: String = "ABC"
    println(a.drop(2))
}

drop(2) 예시 출력 결과

 

만약 0을 인자로 한다면?

fun main() {
    var a: String = "ABC"
    println(a.drop(0))
}

drop(0) 예시 출력 결과

만약 음수 값을 인자로 한다면?

-> IllegalArgumentException 발생

 

만약 문자열의 길이 이상의 값을 인자로 한다면?

-> 단지 모든 문자열이 지워지고 빈 문자열이 반환됨

 

 

나중에 String과 CharSequence의 차이점이 있다면 알아보고 두 가지를 구분해서 함수를 분류해서 정리하면 좋을 것 같다.

 

'Language > Kotlin' 카테고리의 다른 글

Kotlin 제네릭  (0) 2021.01.06
Kotlin 캐스팅  (0) 2021.01.06
Kotlin 옵저버 패턴  (0) 2021.01.03
Kotlin 오브젝트  (0) 2021.01.03
Kotlin 스코프 함수  (0) 2021.01.02