본문 바로가기
언어/Kotlin

[Kotlin 문법] 문자열 다루기

by 젼젼39 2024. 3. 15.

1. 문자열의 기본 처리

    문자열 : 연속된 문자의 배열

            - 불변값으로 생성되어 참조되고 있는 메모리가 변경될 수 없음
            - 새로운 값 할당하려면 새로운 문자열을 위한 메모리 만들어 할당해야 함

val hello: String = "Hello World!"

println(hello[0]) 		//h

hello[0] = 'K' 		//오류!
var s = "abcdefg"
s = "xyz" 		//새로운 메모리 공간이 생성됨
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");

s1과 s2의 hello는 완전히 동일한 공간에 있음
but new로 선언되면 heap의 다른 공간에 만들어짐

1) 문자열 추출하고 병합하기    substring( ), subSequence( )

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

CharSequence.subSequence(인덱스 범위 지정): CharSequence
s = "abcdefg"
println(s.substring(0..2)) 	//인덱스 0번~2번 범위의 abc 반환
var s = "abcdef"

s = s.substring(0..1) + "X" + s.substring(3..s.length-1)

ab + X + def
마지막 인덱스 = s.length-1

2) 문자열 비교하기 compareTo( )

    - s1.compareTo(s2) : s1 이 s2보다 작으면(사전적으로 뒤) 양수 / 같으면 0 / s1이 s2보다 크면(사전적으로 앞) 음수 반환

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

32 		//K 와 k 사이의 아스키코드 값 차이
0

3) StringBuilder 사용하기

    : 문자열이 사용할 공간을 좀 더 크게 잡을 수 있음 -> 특정 단어를 변경할 수 있게 됨

var s = StringBuilder("Hello")

s[2] = 'x'

Hexlo

    - 메모리 공간을 새롭게 만들지 않고 여유분의 공간을 이용해 문자 요소를 변경

s.append("World") 	//문자열 추가, HexloWorld
s.insert(10, "Added") 	//인덱스 10번부터 추가되어 HexloWorldAdded
s.delete(5,10) 		//인덱스 5번부터 10번 전까지 삭제, HexloAdded

 

4) 기타 문자열 처리  toLowerCase, toUpperCase, split, trim

    - 각 함수는 원본 문자열을 변경하지 않고, 새로운 문자열을 반환함

fun main() {
    // toLowerCase: 문자열을 모두 소문자로 변환
    val str1 = "Hello World"
    val lowerCaseStr = str1.toLowerCase()
    println(lowerCaseStr) // 출력: hello world

    // toUpperCase: 문자열을 모두 대문자로 변환
    val str2 = "Hello World"
    val upperCaseStr = str2.toUpperCase()
    println(upperCaseStr) // 출력: HELLO WORLD

    // split: 문자열을 지정된 구분자를 기준으로 나누어 배열로 반환
    val str3 = "apple,orange,banana"
    val fruitsArray = str3.split(",") // 쉼표를 기준으로 문자열을 나누어 배열List<String>로 반환
    println(fruitsArray) // 출력: [apple, orange, banana]

    // trim: 문자열의 앞뒤 공백을 제거
    val str4 = "   Hello World   "
    val trimmedStr = str4.trim()
    println(trimmedStr) // 출력: Hello World
}

        =, - 가 사용되는 부분에서 문자열이 잘리게 하려면

str.split("=", "-")

 

5) 문자열을 정수로 변환하기

    - toInt() 메서드는 자바의 Integer.parseInt를 사용함

fun main() {
    try{
        "12w".toInt() 	//숫자가 아닌 문자 w가 포함되어 예외 발생
    } catch(e: NumberFormatException){
        println(e.printStackTrace())
    }
}

        //숫자가 아닌 문자가 포함되었을 때 null을 반환받으려면 toIntOrNull( )

fun main() {
    try{
        "12w".toIntOrNull() 	//숫자가 아닌 문자 w가 포함되어 예외 발생, but 프로그램 중단되진 않음
    } catch(e: NumberFormatException){
        println(e.printStackTrace())
    }
}

 

2. 리터럴 문자열

    : 특수한 문자를 처리하기 위해 \ 를 포함한 문자 표현인 이스케이프 문자를 사용할 수 있음

\t 탭 \r 캐리지 리턴 \\ 백슬래시 \b 백스페이스
\' 작은따옴표 \" 큰따옴표 \$ 달러기호 \n 개행 ( new line )
fun main() {
    val multilineString = """
        |Hello
        |   World
        |  Kotlin
    """

    println(multilineString)
}


        |Hello
        |   World
        |  Kotlin
fun main() {
    val multilineString = """
        |Hello
        |   World
        |  Kotlin
    """.trimMargin()

    println(multilineString)
}

Hello
   World
  Kotlin

 

    - 형식 문자 사용하기

%b 참거짓 boolean %o 8진 정수 %g 10진 or E 표기법의 정수 %d 부호 있는 정수
%t 날짜나 시간 %n 줄 구분 %f 10진 실수 %c 문자
%h 해시코드 %x 16진 정수 %e E 표기법의 실수 %s 문자열
fun main() {
    val pi = 3.141592
    val dec = 10
    val s = "Hello"
    
    println("pi = %.2f, %3d, %s".format(pi, dec, s))

}

pi = 3.14,  10, Hello
소수점 아래 자리 / 3자리 차지하게