728x90
    
    
  kotlin은 정적으로 입력되는 언어. 즉, 컴파일 시간에 유형이 결정되고 절대 변경되지 않음
- val: 값이 변경되지 않는 변수
- var: 값이 변경될 수 있는 변수
kotlin변수는 기본적으로 null값을 보유할 수 없음
null 값을 포함하는 변수는 nullable 유형이어야함
val languageName: String? = null
조건문 자바와 다른 점
if (count == 42) {
    println("I have the answer.")
} else if (count > 35) {
    println("The answer is close.")
} else {
    println("The answer eludes me.")
}
----
val answerString: String = if (count == 42) {
    "I have the answer."
} else if (count > 35) {
    "The answer is close."
} else {
    "The answer eludes me."
}
println(answerString)
----
val answerString = when {
    count == 42 -> "I have the answer."
    count > 35 -> "The answer is close."
    else -> "The answer eludes me."
}
println(answerString)
스마트 캐스트
Any로 선언된 변수의 타입을 알아서 변환해준다.
안전 호출 연산자 또는 null이 아닌 어설션 연산자를 사용하여 nullable 값을 처리하는 대신 아래 예와 같이 조건문을 사용하여 변수에 null 값 참조가 있는지 확인할 수 있음
val languageName: String? = null
if (languageName != null) {
    // No need to write languageName?.toUpperCase()
    println(languageName.toUpperCase())
}
함수
fun 키워드 사용
fun generateAnswerString(): String {
    val answerString = if (count == 42) {
        "I have the answer."
    } else {
        "The answer eludes me"
    }
    return answerString
}
-- 인수가 있는 경우
fun generateAnswerString(countThreshold: Int): String {
    val answerString = if (count > countThreshold) {
        "I have the answer."
    } else {
        "The answer eludes me."
    }
    return answerString
}
익명 함수
val stringLengthFunc: (String) -> Int = { input ->
    input.length
}
고차 함수
fun stringMapper(str: String, mapper: (String) -> Int): Int {
    // Invoke function
    return mapper(str)
}
아래 예와 같이 다른 입력 매개변수를 충족하는 함수, 즉 String 을 입력으로 사용하고 int 를 출력하는 함수와 String 을 전달하여stringMapper()를 호출할 수 있음
stringMapper("Android", { input ->
    input.length
})
stringMapper("Android") { input ->
    input.length
}
let
val firstName : String?
val lastName : String
if(firstName != null) print("$firstName $lastName")
else print("$lastName")
//let 사용
firstName?.let { print("$firstName $lastName") } ?: print("$lastName")
lateinit vs lazy
늦은 초기화: 객체를 늦게 초기화 하는 것
객체의 초기 상태를 정의하기 어려울 때 null을 사용하게 두는 것보다는 늦은 초기화 기법을 사용한다.
lateinit → lateinit을 사용하면 늦은 초기화 이후에도 값이 계속해서 바뀔 수 있다.
fun main() {
    lateinit var text: String
    // ~~~
    val result1 = 30
    text = "Result : $result1"
    println(text)
    // ~~~
    val result2 = 50
    text = "Result : ${result1 + result2}"
    println(text)
}
by lazy
fun main() {
    lateinit var text: String
    val textLength: Int by lazy {
        text.length
    }
    // ~~
    text = "H43RO_Velog"
    println(textLength)
}
728x90