메이쁘

[Kotlin] lateinit, lazy 문법 간단 정리 및 사용방법 ! 본문

Language/Kotlin

[Kotlin] lateinit, lazy 문법 간단 정리 및 사용방법 !

메이쁘 2020. 6. 13. 19:30

안녕하세요.

 

Kotlin에서 주로 사용하는 문법들 중 늦은 문법들에 대해 다뤄보겠습니다.

 

 

 

 

우선

 

 

  Q.  lateinit, lazy 를 사용하는 이유는 ?

 

 

  A. 

 

    보통 class에서 변수를 초기화하면, 클래스 생성 시 해당 변수도 함께 생성되며 초기화된다.

 

    그렇게 되면 클래스 객체를 생성할 때 마다 해당 변수도 함께 초기화되기 때문에 바로 사용할 수 있다는 장점이 있다.

 

    하지만 해당 변수를 바로 사용하지 않거나 꼭 사용하는 경우가 아니라면??

 

    오히려 클래스 생성마다 해당 변수를 만들고 초기화 하는 것이 시간적, 메모리적 낭비라는 거죠.

 

 

    또한, 전역 변수를 선언하기 위해 굳이 = null 을 번거롭게 해야 할 경우도 종종 있습니다.

 

    그래서 Kotlin 에서는 lateinit 과 lazy 문법을 만들었습니다.

 

 

lateinit ?


  -  말 그대로 늦은 초기화. 변수 생성은 미리 해두고 초기화는 해당 변수가 필요할 때 초기화합니다.

 

  -  미리 이름만 올려놓고 실제로 사용할 때 값을 넣겠다는 것이죠.

 

  -  lateinit 은 여러 조건이 있습니다.

 

    

    ->  var(mutable) 변수에만 사용 가능

 

    ->  var 이기 때문에 언제든지 초기화 변경 가능

 

    ->  null 로 초기화 불가능

 

    ->  초기화 전까지 변수 사용 금지 (오류 발생)

 

    ->  해당 변수에 대한 getter/setter 정의 / 사용 금지

 

    ->  primitive type(Int, Double 등) 에는 사용 불가능

    *** 단, String은 사용 가능

 

    ->  ::temp.isInitialized 로 초기화 여부 확인 가능 

    *** if(::text.isInitialized) ? true : false

 

 

  -  로그 출력 : "임시"

 

  -  위처럼 var 앞에 lateinit 을 명시합니다.

 

  -  만약, "임시" 로 정의하기 전에 해당 변수를 사용한다면, 오류가 나겠죠 ?

 

 

lazy ?


  -  Delegated Property. 즉, getter / setter 를 특정 변수에 위임하고, 이 변수를 호출하는 시점에 초기화합니다.

 

  -  lambda 함수로 정의하기 때문에 { } 안에 여러 코드를 넣은 후 맨 마지막에 리턴하는 변수가 값이 됩니다.

 

  -  val(immutable) 에만 lazy 초기화가 가능합니다.

 

  -  즉, 처음 불리는 시점에만 { } 내의 코드를 진행하면서 해당 변수를 초기화 하고, 다음 부터는 적용된 변수 값만 호출됩니다.

 

  -  lazy에는 인자를 통해 옵션을 설정할 수 있는데, default 인자는 Synchronized(동기화) 이다.

 

 

 

Output)

 

"시작합니다."

"start!"

"second!"

"end"

"end"

 

 

 

 

lateinit 이나 lazy 나 null을 꼭 사용하는 경우에는 사용하지 않는 것이 좋습니다.

 

 

감사합니다!

Comments