출처: 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는 문자열이 사용할 공간을 좀더 크게 잡아서 사용한다.
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
}
package chap04.section3
fun main() {
val deli = "Welcome to Kotlin"
val sp = deli.split(" ")
println(sp) // [Welcome, to, Kotlin]
}
cf) newline과 carriage return은 윈도우, 맥, 리눅스 등 사용하는 운영체제에 따라 처리 방식이 약간 다르다.
Window | Mac | Unix |
---|---|---|
\r\n | \r | \n |
개행 그대로 출력하면서 앞의 공백은 제거하고 싶은 경우 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