코틀린

코틀린 2편

태인킴 2020. 11. 10. 21:36
반응형


1. Array

fun arrayExp() {
    val array : Array<Int> = arrayOf(1, 2, 3)
    val array2 : Array<Any> = arrayOf(1, "d", 3.4f)
    array[0] = 3
}

Array사이즈가 고정되어 있습니다. 따라서 메모리가 이미 할당이 되면서 초기화가 이루어 집니다. 원소값이 모두 Int 형이기 때문에, 제네릭 타입이 Int 입니다. array2원소 타입이 다양하므로 제네릭 타입으로 Any가 쓰였습니다.

 

 

2. List

fun listExp() {
    val list : List<Int> = listOf(1, 2, 3)
    val list2 : List<Any> = listOf(1, "d", 11L)
    var result : Int = list.get(0)
    
    val arrayList : ArrayList<Int> = arrayListOf<Int>()
    arrayList.add(10)
    arrayList.add(20)
    arrayList[0] = 20
}

List수정이 불가능한 인터페이스 입니다. MutableList수정이 가능 합니다. MutableList대표적인것이 ArrayList가 있습니다. 'ArrayList[0] = 20' 으로 데이터의 수정이 가능 합니다.

 

 

3. for 문

fun forExp() {
    val fruits = arrayListOf("apple", "banna")
    for ( name in fruits ) {
        print("${name} ")
    }

    println()
    print("ArrayList.withIndex() : ")
    for ( (index, name) in fruits.withIndex() ) {
        print("${index + 1}번째 과일 : ${name}   ")
    }

    println()
    print("1..3 : ")
    for ( i in 1..3 ) {
        print("${i} ")
    }

    println()
    print("1..5 step 2 : ")
    for ( i in 1..5 step 2) {
        print("${i} ")
    }

    println()
    print("5 downTo 1 : ")
    for ( i in 5 downTo 1) {
        print("${i} ")
    }

    // 5는 포함하지 않음
    println()
    print("1 until 5 : ")
    for ( i in 1 until 5) {
        print("${i} ")
    }
}

출력 결과

ArrayList의 경우 .withIndex() 메서드를 지원하여 반복문에서 index를 지원 합니다. '1..3' 과 같이 배열을 만들어 활용 할수도 있습니다. 또한, for문에서 'step'(step 만큼 이동), 'down'(감소), 'until'(마지막 값은 제외) 을 이용하여 다양하게 활용 할 수 있습니다. 

 

 

4. Nullable(? 키워드) / NonNull 

fun nullCheck() {
    var nonNullName : String = "taein"
    var nullableName : String? = null

    var nameInUpperCase = nonNullName.toUpperCase()
    var nullNameInUpperCase = nullableName?.toUpperCase()

    println(nameInUpperCase)
    println(nullNameInUpperCase)
}

코틀린은 자바와 다르게, null 체크를 런타임이 아닌 컴파일 타임에 잡을수 있도록 노력했습니다. 'nullableName : String?' 끝에 '?' 를 사용하므로써, 'nullable'(null이 허용 된다)을 표현 할수 있습니다. 반대로 '?'가 들어가지 않았다면, NonNull 타입 입니다. 따라서, nullableName'?'를 지운다면, 컴파일 시점의 에러가 떨어집니다.

 

 

5. elvis 연산자 (?:)

fun elvisExp() {
    var lastName : String? = null
    println("taein " + (lastName ?: "No LastName"))

    lastName = "Kim"
    println("taein " + (lastName ?: "No LastName"))
}

출력 결과

엘비스(elvis) 연산자'?:' 를 사용하여, null인 경우 '?:' 다음의 값을 반환 하고, null이 아닐 경우, 현재 데이터를 반환 합니다.

 

 

6. !! 연산자

fun main() {
    ignoreNullExp(null)
}

fun ignoreNullExp(str : String?) {
    val notNull : String? = str
    println(notNull)

    val notNull2 : String = str!!
    println(notNull2)
}

출력 결과

'!!' 연산자Nullable을 NonNull로 변경해주는 연산자 입니다. 따라서, println(notNull2) 에서 NPE(NullPointerException)가 떨어지는 것이 아니라, 'val noNull2 : String = str!!' 에서 NPE가 떨어 집니다. 만약 java 였다면, 'println(notNull2)' 에서 NPE가 떨어 졌을 것 입니다. 

 

 

7.  let 메서드

fun letExp() {
    var email: String? = "worldXXX@gmail.com"
    email?.let {
        println("my email is ${email} in NonNull")
    }

    email?.let {
        println("my email is ${it} in NonNull using it")
    }

    email = null
    email?.let {
        println("my email is ${email}")
    }
}

출력 결과

Nullable인 email 변수는 .let() 메서드를 사용하여, null이 아닌 경우의 로직을 정의 할 수 있습니다.  또한, let 메서드 안에서 'email' 대신 'it' 이라는 키워드를 사용하여, 현재 값을 사용할 수 있습니다. 

반응형

'코틀린' 카테고리의 다른 글

코틀린 6편 (lateinit)  (0) 2020.11.13
코틀린 5편 (data class, object, companion object)  (0) 2020.11.11
코틀린 4편 (람다 Lamda)  (0) 2020.11.11
코틀린 3편 (클래스 생성자와 상속)  (0) 2020.11.10
코틀린 1편  (0) 2020.09.16