[Kotlin] Ch4-3. 문자열 다루기

leeeha·2022년 9월 3일
0

코틀린

목록 보기
23/28
post-thumbnail

출처: https://www.boostcourse.org/mo234/lecture/154310?isDesc=false

문자열의 기본 처리

String s1 = "Cat" 에서 "Cat"과 같은 String 리터럴은 Heap 영역 내의 String Pool 이라는 곳에 생성되며, 객체 s1은 스택 영역에서 해당 문자열을 가리키고 있다. 그리고 String 리터럴로 생성한 객체는, 내용이 같으면 동일한 메모리 주소를 가리킨다.

반면에, 자바에서 new 연산자로 생성한 문자열 객체는 같은 값이 String Pool에 이미 존재하더라도, Heap 영역 내에 매번 새로운 객체로 생성된다.

cf) 자바에서 == 연산자는 값과 참조를 모두 비교하지만, 코틀린에서 == 연산자는 값만 비교하고 참조를 비교할 때는 === 연산자를 사용한다.

package chap04.section3

fun main() {
    val hello = "Hello World!" // val은 변경 불가 
    println(hello[0]) // H
    //hello[0] = 'K' // error 
    
    var s = "abcdef" // var은 변경 가능 
    s = "xyz" // 새로운 메모리 공간에 할당됨. (기존의 문자열은 가비지 컬렉터에 의해 제거됨.) 
    println(s) 
}

그리고 코틀린의 String 리터럴은 불변(immutable) 값으로 생성된다. 즉, 한번 생성된 문자열의 메모리 주소는 변경될 수 없다. 따라서, 문자열 객체에 새로운 값을 할당하면 원본 자체가 변경되는 게 아니라 아예 새로운 메모리 공간에 할당된다. 위의 예제에서 s는 "abcdef"가 아니라 "xyz" 문자열을 가리키게 된다.


문자열 추출 및 병합

String.substring(인덱스 범위 지정): String
CharSequence.subSequence(인덱스 범위 지정): CharSequence

package chap04.section3

fun main() {
    var s = "abcdef"
    s = s.substring(0..1) + "x" +
            s.substring(3 until s.length)
    println(s) // abxdef 
}

문자열의 비교

a.compareTo(b) : a가 b보다 작으면 양수, 같으면 0, 그렇지 않으면 음수 반환

package chap04.section3

fun main() {
    val s1 = "Hello Kotlin"
    val s2 = "Hello KOTLIN"
    println(s1.compareTo(s2))
    println(s1.compareTo(s2, true)) // 대소문자 무시
}

StringBuilder의 이용

StringBuilder는 문자열이 사용할 공간을 좀더 크게 잡아서 사용한다.

  • 간단한 요소 변경이 있을 때 용이하다.
  • 단, 포인터로 변경된 요소를 가리키는 원리이기 때문에, 기존의 문자열보다는 처리가 좀 느리고, 만약 단어를 변경하지 않는 경우에는 불필요하게 메모리를 낭비할 수도 있다.
  • 따라서, 문자열이 자주 변경되는 경우에 사용하도록 하자.
package chap04.section3

fun main() {
    val s = java.lang.StringBuilder("Hello")
    s[2] = 'x' // 요소의 변경이 가능해짐. 
    println(s) // Hexlo 
}

관련 메서드

package chap04.section3

fun main() {
    val s = java.lang.StringBuilder("Hello")
    s[2] = 'x' // 요소의 변경이 가능해짐.
    println(s) // Hexlo

	// 문자열 조작하기 
    s.append("World") // HexloWorld 
    s.insert(10, "Added") // 인덱스 10부터 추가되어 HexloWorldAdded 
    s.delete(5, 10) // [start, end) 요소 삭제되어 HexloAdded 
}

기타 문자열 처리

  • 소문자/대문자 변경: uppercase(), lowercase()
  • 특정 문자 단위로 잘라내기: split("분리 문자") → 분리된 내용은 List로 반환
  • 앞뒤에 있는 화이트 스페이스 문자 제거: trim()
package chap04.section3

fun main() {
    val deli = "Welcome to Kotlin"
    val sp = deli.split(" ")
    println(sp) // [Welcome, to, Kotlin] 
}

리터럴 문자열

이스케이프(Escape) 문자

cf) newline과 carriage return은 윈도우, 맥, 리눅스 등 사용하는 운영체제에 따라 처리 방식이 약간 다르다.

WindowMacUnix
\r\n\r\n

3중 따옴표

개행 그대로 출력하면서 앞의 공백은 제거하고 싶은 경우 trimMargin() 사용

package chap04.section3

fun main() {
    val text = """
        Tell me and I forget.
        |Teach me and I remember.
        Involve me and I learn.
        |(Benjamin Franklin)
    """.trimMargin() // trim 디폴트 문자는 | 
    println(text)
}
   Tell me and I forget.

Teach me and I remember.
Involve me and I learn.
(Benjamin Franklin)

형식 문자

format()을 사용하여 원하는 형식대로 출력할 수 있다.

pi = 3.14, 10, hello

profile
꾸준히!

0개의 댓글