본문 바로가기
기타/코틀린

코틀린 특징 및 자바와 차이점 정리(작성중)

by 창이2 2021. 10. 4.

1. 코틀린은 mutable과 immutable 변수를 var와 val이라는 키워드로 쉽게 설정가능

var는 mutable하고 val은 immutable 이다. 자바로 치면 val은 final과 같다.

 

2. 코틀린은 객체의 초기화에 대해서 늦은 초기화가 가능하다. 즉 변수가 사용될 시점에서 초기화가 가능하다. 

var 변수의 경우 lateinit var를 설정하면 반드시 한번은 초기화를 해야한다.

반면 val 변수의 경우 선언과 동시에 초기화하는 코드를 넣어주고 변수가 참조될때 초기화가 된다.

 

val lazyTest: String by lazy { "Test" }
lateinit var lateInitTest: String

fun main() {

    println(lazyTest)
    println(lateInitTest) //Error!! 반드시 초기화를 해줘야함 ex) lateInitTest = "Test"

}

 

3. 코틀린에서의 scope function

   3.1. apply : 호출시 receiver, 호출함수 블록에서 receiver로 받음(this), 마지막 결과를 넘기지 않고 자기 자신을 리턴

   3.2. also :  호출시 receiver, 호출함수 블록에서 parameter로 받음(it), 마지막 결과를 넘기지 않고 자기 자신을 리턴

   3.3. run :  호출시 receiver, 호출함수 블록에서 receiver로 받음(this),  마지막 결과를 리턴

   3.4. let :   호출시 receiver, 호출함수 블록에서 parameter로 받음(it), 마지막 결과를 리턴

   3.5. with :  호출시 parameter, 호출함수 블록에서 receiver로 받음(this), 마지막 결과를 리턴

 

package com.jakchang.codingpractice

fun main() {

    var applyTest = 0
    var alsoTest = 0
    var runTest = 0
    var letTest = 0
    var withTest = 0

    //apply
    applyTest.apply {
        applyTest = 5
        10000
    }.apply {
        println("applyTest : $this") // 기존의 자기 자신 리턴
    }

    //also
    alsoTest.also {
        alsoTest = 5
        10000
    }.also {
        println("alsoTest : $it") // 기존의 자기 자신 리턴
    }

    //run
    runTest.run {
        runTest = 5
        10000
    }.run {
        println("runTest : $this") //마지막 결과 리턴
    }

    //let
    letTest.let {
        letTest = 5
        10000
    }.let {
        println("letTest : $it") //마지막 결과 리턴
    }

    //with
    with(withTest) {
        withTest = 5
        10000
    }.run {         // .with(withTest) 가 안됨
        println("withTest : $this") // 마지막 결과 리턴
    }

}


/*

(호출시 receiver).run(block: 코드블록수신객체(receiver).() -> 반환결과타입): 반환결과타입{}

public inline fun <T, R> T.run(block: T.() -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return block()
}

with((호출시 parameter) ,block: 코드블록수신객체(receiver).() -> 반환결과타입): 반환결과타입{}

public inline fun <T, R> with(receiver: T, block: T.() -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return receiver.block()
}

*/

 

4. 안전한 널체크 사용

변수다음에 ?을 붙이면 변수가 null일때 null을 반환하고 !!을 붙이면 nul일때 exception을 발생시킨다.

 

 

 자바와 코틀린에서의 inner class 차이

 

 자바와 코틀린에서의 protected 차이

 

 

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

[Kotlin] Sequence vs Collections  (0) 2022.07.05
[Kotlin] inline과 reified  (0) 2022.07.02
[Kotlin] map, flatMap 비교  (0) 2022.06.21
코틀린 Sealed Class와 Enum Class  (0) 2021.07.01

댓글