[Kotlin 깃북] Ch3 코틀린 사용을 위한 기본 문법 9. 지연 초기화

0
post-thumbnail

[Kotlin 깃북] Ch3 코틀린 사용을 위한 기본 문법

9. 지연 초기화

lateinit

  • 변수만 미리 선언하고 초기화를 나중에 해야할 경우 사용
  • Nullable로 선언하는 경우
    -> 해당 변수의 메서드/프로퍼티에 접근할 때 Safe call 사용해야
    -> 가독성 떨어짐
class Person {
    var name: String? = null
    init {
        name = "Lionel"
    }
    fun process() {
        name?.plus(" Messi")
        print("이름의 길이 = ${name?.length}")
        print("이름의 첫 글자 = ${name?.substring(0, 1)}")
    }
}
  • lateinit 키워드를 사용하는 경우
    -> Safe call 쓰지 않아도 됨
    -> 가독성 좋아짐
class Person {
    lateinit var name: String
    init {
        name = "Lionel"
    }
    fun process(){
        name.plus(" Messi")
        print("이름의 길이 = ${name.length}")
        print("이름의 첫 글자 = ${name.substring(0, 1)}")
    }
}
  • lateinit 특징
    • var로 선언된 클래스 프로퍼티에만 사용 가능
    • null 허용 X
    • 기본 자료형(Int, Long, Double, Float 등) 사용 X
  • lateinit 키워드 사용 후 초기화하지 않고 사용하는 경우
    -> null 예외 발생!

lazy

  • 읽기 전용 변수 val을 지연 초기화할 때 사용
  • 변수 val로 선언한 후, by lazy 키워드 사용
    -> by lazy뒤 중괄호에 초기화할 값 써주기
    (타입 추론 가능 -> 변수 타입 생략 가능)
  • lazy는 최초 호출하는 시점에 초기화됨
class Company {
    val person: Person by lazy { Person() }
    init {
        // lazy는 선언 시에 초기화 -> 초기화 과정 필요 없음
    }
    fun process(){
        print("person의 이름은 ${person.name}") // 최초 호출하는 시점에 초기화됨
    }
}
  • lazy를 사용할 때 주의할 점: 초기화하기 위한 리소스가 너무 큰 경우
    -> 호출되는 시점에 초기화 작업 일어남 -> 전체 처리 속도에 악영향
    -> 미리 초기화하는게 효율적
profile
Be able to be vulnerable, in search of truth

0개의 댓글