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 |
댓글