init을 이용한 초기화
- Kotlin은 속성을 선언하고 초기화 하지 않으면 기본적으로 Error이다.
- init은 해당 class의 생성자를 호출하면 실행된다.
class Person constructor() { // -> Default 생성자는 생략 가능
// 속성 선언 시 초기화를 진행하지 않을 시 Type을 반드시 선언해야한다.
// lateinit 또는 delicate등을 이용
val name: String
var age: Int
val gender: Char
init {
name = "Hong GilDong"
age = 32
gender = 'M'
}
}
null 허용 타입으로 선언한 후 나중에 초기화
- null 허용으로 Type 선언 후 나중에 초기화
- 반드시 var Null 허용 타입으로 선언해야 한다.
class Person {
var name: String? = null
var age = 0
var gender: Char? = null
constructor()
constructor(name: String, age: Int, gender: Char) {
this.name = name
this.age = age
this.gender = gender
}
}
fun main() {
val person1 = Person()
person1.name = "Hong GilDong"
person1.age = 20
person1.gender = 'M'
val person2 = Person("Han GilDong", 22, 'F')
}
lateinit 예약어를 이용한 늦은 초기화
- var Property에만 사용가능(안드로이드에서 많이 사용된다)
- class Body에 선언된 Property에서만 사용가능(주 생성자 속성X)
- getter와 setter를 재정의 할 수 없다.
- null을 허용하는 property에는 사용할 수 없다.
- Byte, Short, Int, Float와 같은 Primitive Type에는 사용할 수 없다.
class Person {
lateinit var name: String
// lateinit var age = 0 // -> 기본 타입에는 사용 불가
// lateinit var gender: Char? = 'F' // -> 기본타입에는 사용불가
constructor(name: String, age: Int, gender: Char) {
this.name = name
// this.age = age
// this.gender = gender
}
}
fun main() {
val person = Person("Hong GilDong", 20, 'M')
}
by lazy를 이용한 늦은 초기화
- by lazy { ... } 를 이용해 Property 사용 시점에 { ... } 가 실행된다. 이때 사용 시점에 딱 한번만 초기화가 된다. 이후에는 생성된 상태의 초기값을 그대로 이용한다.
- val Property에만 사용 가능
- Byte, Short, Int, Float와 같은 Primitive Type에서도 사용가능 하다.
- class Body 뿐만 아니라 Top-Level에서도 사용가능 하다.
- 다른 속성 또는 변수의 초기화 이후에 값을 사용해야 하는 경우에 사용한다.
var temp = 1
val increment: Int by lazy {
++temp
}
class Person {
val name: String by lazy {
println("lazy init")
"Hong GilDong" // -> by lazy는 표현식이므로 할당할 값이 맨 마지막에 와야한다.
}
val age: Int by lazy {
20
}
val gender: Char by lazy {
'M'
}
}
fun main() {
val person = Person()
println("name:${person.name}, age:${person.age}, gender:${person.gender}") // -> 사용 시점에 할당됨
println("increment: $increment")
println("increment: $increment") // -> 증가하지 않음.
}
결과
lazy init
name:Hong GilDong, age:20, gender:M
increment: 2
increment: 2