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)
}