본문 바로가기

코틀린

코틀린: String과 CharArray

스트링 풀과 intern() 메소드 예제의 보충 설명입니다. 자세한 내용은 쉽게 다가가는 최신 프로그래밍: 코틀린 - 1.9.1 스트링 풀을 참고하기 바랍니다.

String과 CharArray의 차이점이 뭘까요? 가장 큰 차이점은 String은 불변(immutable)이지만, CharArray는 가변(mutable)이라는 점입니다. String 타입 객체는 문자열을 할당하고 나면,  문자 1개도 바꿀 수 없습니다. 반면 CharArray 타입 객체는 몇 번이고 문자열을 바꿀 수 있습니다.

String과 CharArray는 서로 타입을 변환할 수 있습니다. CharArray 타입을 String 타입으로 변환하려면 생성자 String(chars: CharArray) 를 호출하면 됩니다. String 타입을 CharArray 타입으로 변환하려면 toCharArray() 메소드를 호출하면 됩니다.

fun main() {
    val s: String = "Hello"
    val chArray: CharArray = charArrayOf('H', 'e', 'l', 'l', 'o')
    
    val s2 = String(chArray)
    val chArray2 = s.toCharArray()
}

 

String 과 CharArray의 두 번째 차이점은 String은 문자열 관련 다양한 함수(replace, subString, lowercase 등)를 사용할 수 있지만, CharArray는 그런 함수들이 없어 직접 변경해야 하는 점입니다. 아래 코드에서 copyOf()는 배열 객체를 복사하는 함수이며, 코틀린 라이브러리에 포함되어 있습니다. 참고로 clone()은 자바 라이브러리에서 제공하는 함수입니다. 

fun main() {
    val s: String = "Hello"
    val chArray: CharArray = charArrayOf('H', 'e', 'l', 'l', 'o')
    val orgArray = chArray.copyOf()

    val newStr = s.replace('H', 'h')
    println("$s is modified to $newStr")
    
    chArray[0] = 'h'
    println("${orgArray.joinToString("")} is modified to ${chArray.joinToString("")}")
}

 

잠깐!  CharArray 타입 객체는 배열이기 때문에 그대로 출력할 수 없습니다. 해결 방법 중 하나는 배열 원소를 출력하기 위해 사용하는 contentToString()을 사용하는 것입니다. 그러나, 이 방법 보다는 joinToString(separator: CharSequence)를 사용하는 것이 출력 결과가 보기 좋습니다. 괄호 안의 인자 separator는 원소와 원소를 연결하는 문자열입니다. CharSequence는 쉽게 다가가는 최신 프로그래밍: 코틀린 - 1.10 String과 CharSequence를 참고하기 바랍니다.

fun main() {
    val chArray: CharArray = charArrayOf('H', 'e', 'l', 'l', 'o')

    println(chArray.contentToString())
    println(chArray.joinToString(""))
}

 

조금 귀찮긴 하지만 아래처럼 CharArray 타입 객체를 String 타입 객체로 변환하는 게 편할 때도 있습니다.

fun main() {
    val chArray: CharArray = charArrayOf('H', 'e', 'l', 'l', 'o')
    val orgArray = chArray.copyOf()
    val s2: String = String(chArray)

    val newStr: String = s2.uppercase()
    println("${orgArray.joinToString("")} is modified to $newStr")
}

 

이제 준비가 되었죠! 예제 실행 결과가 왜 그렇게 나왔는지 분석해 보기 바랍니다. String 타입 객체 s와 CharArray 타입 객체 chArray가 분명 같은 값을 갖고 있는 데 말이죠...

fun main() {
    val s = "Hello"
    val chArray = charArrayOf('H', 'e', 'l', 'l', 'o')
    val s2 = String(chArray)

    println(s == s2)
    println(s === s2)
}