- Today
- Yesterday
- Total
메이쁘
[Kotlin] lateinit, lazy 문법 간단 정리 및 사용방법 ! 본문
안녕하세요.
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을 꼭 사용하는 경우에는 사용하지 않는 것이 좋습니다.
감사합니다!