변수나 상수의 값을 나중에 초기화하는 문법
코틀린은 클래스를 설계할 때 안정성을 위해 반드시 변수의 값을 초기화해야 됨
lateinit, lazy 키워드를 활용
변수: lateinit
상수: lazy
저사양으로 제한되어 있는 환경에서 메모리를 더욱 효율적으로 사용 가능
fun main(){
var s1 = Student() // 클래스 객체 생성, 인스턴스화
// 여기까지는 name 프로퍼티는 초기화 안 됨
s1.name = "참새" //name 프로퍼티에 값 할당(초기화)
s1.displayInfo() //메서드 실행
s1.age = 10 //age 프로퍼티의 값을 다시 할당
s1.displayInfo() //메서드 실행
}
//명시적 생성자를 사용하지 않고 클래스 정의
class Student {
// var name:String = ""
lateinit var name:String //변수를 나중에 할당받을 수 있음
var age:Int = 0 //age 프로퍼티의 초기값을 0으로 할당
fun displayInfo() {
println("이름은: ${name} 입니다.")
println("나이는: ${age} 입니다.")
}
}
fun main(){
var s1 = Student() // 클래스 객체 생성, 인스턴스화
// 여기까지는 name 프로퍼티는 초기화 안 됨
s1.name = "참새" //name 프로퍼티에 값 할당(초기화)
s1.displayInfo() //메서드 실행
//name 변수를 초기화해주세요 출력
s1.age = 10 // age 프로퍼티에 값 다시 할당
s1.displayInfo() //메서드 실행
//이름과 나이 출력
}
//명시적 생성자를 사용하지 않고 클래스 정의
class Student {
lateinit var name:String //변수를 나중에 할당받을 수 있음
var age:Int = 0 //age 프로퍼티의 초기값을 0으로 할당
fun displayInfo() {
//Student 클래스의 name 프로퍼티의 초기값이 정해졌다면
if(this::name.isInitialized) {
println("이름은: ${name} 입니다.")
println("나이는: ${age} 입니다.")
}
// Student 클래스의 name 프로퍼티 초기값이 정해지지 않았다면
else {
println("name변수를 초기화해주세요.")
}
}
}
fun main(){
var s1 = Student() // 클래스 객체 생성, 인스턴스화
// 여기까지는 name 프로퍼티는 초기화 안 됨
// address 프로퍼티도 초기화 안 됨
s1.name = "참새" //name 프로퍼티에 값 할당(초기화)
s1.displayInfo() //이 메서드를 호출할 때 address 프로퍼티가 사용되므로 이때 초기화
s1.age = 10 //age 프로퍼티에 값을 다시 할당
s1.displayInfo() //위에서 address 프로퍼티 초기화를 했기 때문에, 초기화는 진행하지 않음
}
//명시적 생성자를 사용하지 않고 클래스 정의
class Student {
// 변수 지연 초기화
lateinit var name:String //변수를 나중에 할당받을 수 있음
var age:Int = 0 //age 프로퍼티의 초기값을 0으로 할당
// 상수 지연 초기화
val address: String by lazy {
println("address 초기화") //초기화가 되었을 때 실행할 코드
"seoul" //초기화 값
}
fun displayInfo() {
println("이름은: ${name} 입니다.")
println("나이는: ${age} 입니다.")
println("주소는: ${address} 입니다.")
}
}
https://velog.io/@hoyaho/%EC%A7%80%EC%97%B0-%EC%B4%88%EA%B8%B0%ED%99%94