ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [코틀린 완벽 가이드] 2장 코틀린 언어 기초 (2.3 - 2.4)
    코틀린 공부/코틀린 2023. 12. 27. 15:33

    2.3 문자열

    2.3.1 문자열 템플릿

    val hello = "Hello, world!"

     

    코틀린은 여러 가지 식에서 문자열을 합성해내는 훨씬 더 강력한 방법을 지원한다.

    println("$hello, Today is ${Date()}")

     

    결과 :

    Hello, world!, Today is Wed Dec 27 15:24:31 KST 2023

     

     

    ${}의 중괄호 사이에 넣기만하면, 어떤 올바른 코틀린 식이든 문자열에 넣을 수 있다. 이런 기능을 문자열 템플릿이라고 한다.

     

    또 다른 문자열 유형으로 로우 문자열(raw string)이 있다. 로우 문자열을 사용하면 이스케이프 시퀀스를 사용하지 않고도 문자열 작성이 가능하다.

    val message = """
        $hello,
        Today is ${Date()}
    """.trimIndent()
    println(message)

     

    결과 :

    Hello, world!,
    Today is Wed Dec 27 15:28:43 KST 2023

     

    2.3.2 기본 문자열 연산

    println("Hello!".length) // 6
    println("Hello!".lastIndex) // 5
    println("Hello!"[0]) // H

     

     

    자바에서는 ==와 != 연산자를 참조 동등성 비교를 하기 때문에 문자열을 비교하려면 equals메소드를 사용해야 했지만 코틀린에서는 ==이 직접 equals를 호출하므로 ==을 사용하면된다. 

     

    코틀린에서 참조 동등성을 쓰고 싶으면 ===, !==을 사용하면 된다

     

    유용한 함수들 :

    • isEmpty, isNotEmpty : 문자열이 비어있는지 검사
    • substring : 부분 문자열을 추출한다.
    • startsWith, endsWIth : 접두사나 접미사인지 검사한다. 
    • indexOf : 인자로 받은 문자나 문자열이 수신객체인 문자열에 나타나는 몇번째 index인지 반환한다.  없다면 -1 반환

    2.4 배열

    2.4.1 배열 정의하기

    배열 구조를 구현하는 가장 일반적인 코틀린 타입은 Array<T>다. 여기는 T는 원소의 타입을 뜻한다.

    만들려는 배열의 크기를 미리 알 수 있다면 표준 함수 중 하나를 사용해 배열을 생성할 수 있다. 

    val a = emptyArray<String>()
    val b = arrayOf("hello", "World")
    val c = arrayOf(1, 4, 9)

     

    각 함수는 제네릭(generic)하다. 이 말은 호출할 떄 원소의 타입을 지정해야 한다는 뜻이다. 

    하지만 타입 추론 덕분에 2 번째 3 번째 함수 호출의 타입을 인자들의 타입에서 알아낼 수 있다. 

    1 번째 예처럼 추론할 수 있는 단초가 없다면 (<>) 사이에 원소 타입을 명시해야 한다. 이걸 제네릭스라 하고 이건 9장에서 다시 다룬다.

     

    Index로 부터 원소를 만들어내는 방법을 기술해 배열을 생성하는 더 유연한 방법도 있다.

    val size = 3
    val squares = Array(size){
        (it+1) * (it+1) // 1, 4, 9
    }
    println(squares[0]) // 1

     

    중괄호({}) 안에 들어있는 언어 요소를 람다(lambda)라고 부른다. 람다는 index를 기반으로 값을 계산하는 식을 정의한다.

    이때 인덱스를 표현하는 변수로 자동으로 선언되는 it을 사용한다.  (5장에서 더 살펴 봄)

     

    Array<Int>를 사용하는 배열은 제대로 작동은 하지만 모든 수를 박싱하기 때문에 그다시 실용적이지 못한 해법이다. 이런 이유로 코틀린은 더 효율적인 ByteArray, ShortArray, IntArray, LongArray, FloatArray, DoubleArray, CharArray, BooleanArray 라는 특화된 배열 타입을 제공한다.

     

    2.4.2 배열 사용하기 

    val squares2 = arrayOf(1, 4, 9, 16)
    println(squares2.size) // 4
    println(squares2.lastIndex) // 3
    println(squares2[3]) // 16
    squares2[1] = 100
    println(squares2[1]) // 100

     

     

    자바와 마찬가지로 배열 타입의 변수 자체에는 실제 데이터에 대한 참조를 저장한다. 이로 인해 배열 변수에 다른 배열을 대입하면 같은 데이터 집합을 함께 공유하게 된다. 

    val numbers2 = squares2
    numbers2[0] = 1000
    println(squares2[0]) // 1000

     

     

    원본과 별도로 배열을 만들고 싶다면 copyOf() 함수를 사용해야 한다. copyOf()는 필요시 다른 크기의 배열을 만들어 내기도 한다.

    val numbers = squares.copyOf()
    squares.copyOf(2) // 뒤가 짤림: 1, 4
    squares.copyOf(5) // 뒤가 짤림: 1, 4, 9, 16, 0

     

    코틀린에서는 상위 타입의 배열에 하위 타입의 배열을 대입할 수 없다. 

    val test = "hi"
    val test1:Any = test
    println(test1)
    
    val strings = arrayOf("one", "two")
    val strings2: Array<Any> = strings // 예외
Designed by Tistory.