Kotlin string은 참조만 되지 변경하기가 어렵다. Python도 그랬던것 같다. 아마 가볍게 만들려고 그런것 같다.

공부하던중  Kotlin에도 자료구조에 사용하기 좋은 stringBuilder라는 구조를 찾았다.

StringBuilder 클래스는 String처럼 문자열을 다루는 클래스로, String에 문자열을 넣고 인스턴스 생성 후에 값을 변경하지 못했던 점을 개선한 클래스라 할 수 있다. 추가적으로 내부적으로 문자열을 저장하기 위한 메모리 공간을 지닌다. 

이놈은 append도 되고 insert, delete도 된다.  처리후 toString으로 형변환을 시켜주면 된다.

 

StringBuilder stb = new StringBuilder(32);  
이때   예시처럼 작성을 하면 생성자의 인자로 전달되는 숫자인 32 크기만큼 문자를 저장할 수 있는 공간을 마련한다. length를 찍어보면 아직까지는 0이다 메모리공간만 마련하는듯

-append(값) : 문자열 추가한다. 재미있는건 어떤 타입도 다 문자열로 바꾼다.
-delete(시작, 끝) : 시작 인덱스부터 끝 인덱스까지의 내용을 삭제한다.
-insert(위치, 값) : 특정 원하는 위치에 문자열을 추가한다.
-replace(시작, 끝, 값) : 시작 인덱스부터 끝 인덱스 이전까지의 내용을 추가하고자 하는 '값'으로 문자열을 대체한다.
-reverse() : 저장해놨던 문자열의 내용을 뒤집는다.
-substring(시작, 끝) : 저장된 문자열 중에서 시작부터 끝 이전까지의 내용만 담은 String 인스턴스의 값을 반환한다.
-deleteCharAt(위치) :  특정 위치의 값만 삭제한다.

fun main(args : Array<String>) {
    /*
    기존 참조하던 "abc" 뒤에 "def"를 추가하는 것이 아니라
    추가된 문자열 "abcdef"를 새로 생성하고 참조하는 것이다.
    그러면 쓰레기 "abc"가 남게되며 이러한 과정이 많아지면 비효율적
    var s1 = "ab"
    s1 += "cd"
    */

    val str = StringBuilder()   // 빈 생성자
    println("1. 문자열 : $str")
    /* 추가 */
    str.append(5)               // Int 타입
    str.append("man")          // String 타입
    str.append(' ')             // Char 타입
    str.append(true)            // Boolean 타입
    str.append(5431)
    str.append(" is ")
    str.append("women")

    println("2. 문자열 : $str")
    println("index=0 : ${str[0]}, index=5 : ${str[5]}")

    /* 삭제 */
    str.deleteCharAt(0) // index
    str.delete(8, 12)    // [start, end)
    println("after delete 0, 8..12 : $str")

    println("=========================================")
    val temp: String = "ABCD"
    val str2 = StringBuilder(temp)  // String을 받는 생성자
    println("1. 문자열 : $str2")
    println("길이 = ${str2.length}")
    println("뒤집기 = ${str2.reverse()}")

    str2.insert(0, "front+")   // index=0 위치에 추가
    println("2. insert front : $str2")

    val li = listOf("abc", "def", "ghi")
    str2.append(li.joinToString(""))
    println("3. append abcdefghi : $str2")

    println("4-1. 부분 문자열 : ${str2.substring(6)}")       // [6, length)
    println("4-2. 부분 문자열 : ${str2.substring(6, 9)}")        // [6, 8)
    println("4-3. 부분 문자열 : ${str2.substring(6..9)}")    // [6, 9]

    println("=========================================")
    val str3 = str.toString()   // String Type으로 저장
    if(str3 is String) println("String Type")
}

 

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

CharSequence  (0) 2022.09.13
문자열 클래스 String, StringBuffer, StringBuilder  (1) 2022.09.13
String  (0) 2022.09.12

+ Recent posts