코틀린

Do it! 코틀린 프로그래밍, 08-3 문자열 다루기

조요피 2021. 8. 28. 19:37

문자열의 기본 처리

문자열은 연속된 문자의 배열과 같다.

문자열은 불변(immutable) 값으로 생성되기 때문에 참조되고 있는 메모리가 변경될 수 없다.

새로운 값을 할당 하려고 한다면 기존 메모리 이외에 새로운 문자열을 위한 메모리를 만들어 할당해야 한다.

메모리 관점의 문자열

자바의 String은 2가지 방법으로 초기화 된다. 리터럴(literal)과 new 연산자.

String s1 = "Hi";
String s2 = "Hi";
String s3 = new String("Hi");

s1과 s2의 "Hi"는 완전히 동일한 공간에 있다.(상수 풀에 저장, Constant Pool)

하지만, new로 선언되면 String의 객체는 힙에 생성되며 이때 s3의 "Hi"는 다른 공간에 저장된다.

자바 7부터는 상수 풀이 힙 영역으로 옮겨져 기존의 메무리 부족 오류를 개선함.

따라서 기존에 문자열은 GC 대상에 없었으나, 자바 7 이후는 GC 대상에 포함되어 참조가 없으면 메모리에서 삭제됨.

문자열 추출하기

var s = "abcde"
s.substring(0..2)

문자열 비교하기

val s1 = "hi"
val s2 = "HI"

s1.compareTo(s2) // 같으면 0, s1 < s2 양수, 반대면 음수
s1.compareTo(s2, true) // 대소문자 무시

StringBuilder 사용하기

StringBuilder를 사용하면 문자열이 사용할 공간을 더 크게 잡을 수 있기 때문에 요소를 변경할 때 이 부분이 사용되어 특정 단어를 변경할 수 있게 됨.

단, 기존의 문자열보다는 처리 속도가 늦고, 단어를 변경하지 않고 그대로 사용하면 임시 공간을 더 사용하게 되므로 메모리가 낭비됨.

따라서, 문자열이 자주 변경되는 경우에 사용하면 좋음.

var s = StringBuilder("h12345")
s[0] = "0" // 허용되지 않았던 요소의 변경이 가능함

s.append("1234") // 문자열 추가
s.insert(4, "added") // 인덱스 4번부터 문자열 추가
s.delete(5, 10) // 인덱스 5번부터 10번전까지 삭제

기타 문자열 처리

fun main() {
    var s = "welcome to kotlin"
    var a = s.split(" ") // 공백 기준으로 잘라서 a에 할당, List<String>으로 추론되어 할당
    println(a)
}

//[welcome, to, kotlin]

// 하나 이상의 분리 문자를 지정하려면
s.split("=", "+")

문자열을 정수로 변환하기

val n = "123".toInt()

리터럴 문자열

이스케이프 문자 -> 백슬래시 사용

유니코드 -> /uHHHH 형태

삼중 따옴표(""")를 사용하여 개행문자를 넣지 않아도 원본 문자열 그대로 개행까지 표현할 수 있음.

trimMargin()을 사용해 특정 문자 기준으로 공백을 제거할 수 있음. 기본은 '|'

fun main() {
    var s = """
        |asdasdasd
        |123123123
        |ㅋㅋㅋㅋㅋ
    """.trimIndent()
    println(s)

    var s1 = """
        |asdasdasd
        |123123123
        |ㅋㅋㅋㅋㅋ
    """.trimMargin()
    println(s1)

}

//|asdasdasd
//|123123123
//|ㅋㅋㅋㅋㅋ
//asdasdasd
//123123123
//ㅋㅋㅋㅋㅋ

형식 문자 사용하기

fun main() {
    val p = 3.14
    val dec = 10
    val s = "hi"
    println("pi = %.2f, %3d, %s".format(p, dec, s))

}

//pi = 3.14,  10, hi