문자열의 기본 처리
문자열은 연속된 문자의 배열과 같다.
문자열은 불변(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
'코틀린' 카테고리의 다른 글
Do it! 코틀린 프로그래밍, 09-2 List 활용하기 (0) | 2021.08.28 |
---|---|
Do it! 코틀린 프로그래밍, 09-1 컬렉션의 구조와 기본 (0) | 2021.08.28 |
Do it! 코틀린 프로그래밍, 04-3 흐름의 중단과 반환 (0) | 2021.08.26 |
Do it! 코틀린 프로그래밍, 04-2 반복문 (0) | 2021.08.26 |
Do it! 코틀린 프로그래밍, 04-1 조건문 (0) | 2021.08.26 |