val data1 = 10
var data2 = 10
fun main() {
data1 = 20 // 오류가 난다.
data2 = 20 // 가능하다.
}
2. 타입 지정과 타입 추론
보통 언어마다 앞에다가 타입을 지정해주는데,
자바 같은 경우는
TextView textView =...
이런 식으로 textView 변수 앞에 TextView라는 타입을 붙여준다.
코틀린은
변수명 뒤에 붙여준다.
val data1: Int = 10
그리고 이 타입을 생략할 수가 있는데,
값을 넣어주면 알아서 타입을 유추해서 넣어준다(타입 추론).
val data1: Int = 10
val data2 = 10
3. 초깃값 할당
최상위에 선언한 변수나 클래스 내부의 멤버 변수는 선언과 동시에 초깃값을 가져야 한다.
val data1: Int //오류
val data2 = 10 //성공
class User {
val data3: Int //오류
val data4: Int = 10 //성공
}
하지만, 메서드 안에서는 초깃값을 할당하지 않아도 된다.
fun someFun() {
val data: Int
println("data : $data") //오류
data = 10
println("Data : $data") //성공
}
4. 초기화 미루기
앱을 만들다 보면 초깃값을 할당할 수 없는 경우가 생길 수 있다.
앱을 실행하고 추후에 변수에 값을 할당할 경우에는
아래 두 가지 키워드를 사용하면 된다.
lateinit과 lazy 키워드이다.
4 - 1 lateinit
lateinit은 추후에 값을 할당할 것임을 명시적으로 선언합니다.
선언은 아래와 같습니다.
lateinit var data1: Int //오류
lateinit val data2: String //오류
lateinit var data3: String //성공
이렇게만 보시면 왜 어떤 건 오류이고, 어떤건 성공이지 하실 수도 있습니다.
왜냐하면 lateinit에는 2가지 조건이 있기 때문입니다.
- lateinit은 var 키워드로 선언한 변수에서만 사용할 수 있습니다.
- Int, Long, Short, Double, Float, Boolean, Byte 타입에서는 사용할 수 없습니다.
4 - 2 lazy
lazy 키워드는 변수 선언문 뒤에 by lazy {} 형식으로 선언이 됩니다.
코드에서 변수가 최초로 사용이 되면 중괄호 안에 코드가 실행이 됩니다.
그리고 실행된 후에 결과 값이 변수의 초깃값으로 할당이 됩니다.
val data: Int by lazy{
println("in lazy....")
10 // 변수가 사용이 되면, 10이 할당됩니다.
}
fun main() {
println("in main.....")
println(data + 10)
println(data + 10)
}
//실행 결과 값
// in main.....
// in lazy....
// 20
// 20