[Kotlin] 지연초기화 lateinit, lazy

Subeen·2023년 12월 4일
0

Kotlin 문법

목록 보기
11/23

지연초기화

  • 코틀린은 클래스를 설계할 때 안정성을 위해 변수의 값을 초기화 할 것을 권장한다.
  • 클래스를 설계할 때 초기값 정의가 난처해 나중에 대입하기 위한 문법이다.
  • 지연 초기화 또는 늦은 초기화를 위해 lateinitlazy 키워드를 사용한다.
  • 저사양으로 제한 되어 있는 환경에서는 메모리를 더욱 효율적으로 사용할 수 있다.

변수의 지연 초기화

lateinit

  • lateinit은 Int, Long, Double, Float와 같은 Primitive Type에 대해서는 사용할 수 없다.
fun main() {
    var student = Student()
    student.name = "kim"  // name이 초기화 됨 
    student.displayInfo()
    /*
    이름은 kim 입니다.
    나이는 0 입니다.
    */

    student.age = 20
    student.displayInfo()
    /*
    이름은 kim 입니다.
    나이는 20 입니다.
    */
}

class Student {
    lateinit var name:String
    var age:Int = 0

    fun displayInfo() {
        println("이름은 ${name} 입니다.")
        println("나이는 ${age} 입니다.")
	}
}

isInitialized

  • 변수를 사용하기 전에 초기화 되었는지 확인해야 안정성을 높일 수 있다.
  • isInitialized를 사용하여 값이 초기화 되었는지 확인할 수 있으며 true/false 값을 반환한다.
  • 사용할 때는 값이 아니라 참조 형태로 사용해야 하기 때문에 this:: 또는 ::를 붙인다.
fun main() {
    var student = Student()
    student.displayInfo()
    /*
    name 변수를 초기화해 주세요.
    */

    student.name = "kim"
    student.age = 20
    student.displayInfo()
    /*   
    이름은 kim 입니다.
    나이는 20 입니다.
    */
}

class Student {
    lateinit var name:String
    var age:Int = 0

	fun displayInfo() {
        if (this::name.isInitialized) {
            println("이름은 ${name} 입니다.")
            println("나이는 ${age} 입니다.")
        } else {
            println("name 변수를 초기화해 주세요.")
		}
	}
}

상수의 지연 초기화

lazy

  • lazy의 lamda 구문은 변수를 처음 사용할 때 한 번만 호출되며 마지막 값이 초기 값으로 할당 된다. address 상수의 by lazy {} 에 정의한 println("address 초기화")구문이 한 번만 실행 되었음을 확인할 수 있다.
fun main() {
    var student = Student()
    student.name = "kim"
    student.displayInfo()
    /*
    이름은 kim 입니다.
    나이는 0 입니다.
    address 초기화
    주소는 seoul 입니다.
    */

    student.age = 20
    student.displayInfo()
    /*
    이름은 kim 입니다.
    나이는 20 입니다.
    주소는 seoul 입니다.
    */
}

class Student {
    lateinit var name:String 
    var age:Int = 0
    val address: String by lazy {
        println("address 초기화")
		"seoul"
	}

	fun displayInfo() {
		println("이름은 ${name} 입니다.")
		println("나이는 ${age} 입니다.")
		println("주소는 ${address} 입니다.")
	}
}
profile
개발 공부 기록 🌱

0개의 댓글