📚늦은 초기화 기법
늦은 초기화는 말 그대로 객체의 초기화를 늦게 하는 것입니다.
예를 들어 언젠가 변수 str을 사용할 예정인데, str의 첫 상태를 정의하기 어려울 때 또는 어떤 계산의 결과 값을
필요로 할때가 있습니다. 이럴 때 사용 가능한 방법 중 하나는 아래 코드처럼 사용할 수 있습니다.
var str: String? = null
🤔위 방법으로 객체 초기화가 가능한데 lateinit과 by lazy를 왜 사용할까?
첫 번째로 코틀린은 null 사용을 지양하고 있습니다.
위와 같은 방법으로 객체를 초기화한다면 코틀린 창시자는 분명 분노할 것입니다..
두 번째로 만약 Java에서 '더미값'이 들어간 변수를 미처 초기화하지 못하고 사용하게 된다면 무조건 버그가 발생하지만
에러로그엔 잡히지 않기 때문에 어디에서 버그가 발생했는지 추적하기 어렵습니다. 하지만 lateinit과 by lazy는 이 문제를 방지해 줍니다.
세 번째로 시간적, 메모리적 낭비를 줄일 수 있습니다.
자! 그렇다면 이 세 가지를 모두 잡을 수 있는 lateinit과 by lazy를 알아봅시다!
📝lateinit
lateinit을 이렇게 사용할 수 있습니다.
fun main(){
// test 변수 선언
lateinit var test: String
test = "Initalized"
println(test)
test = "Jucoding"
println(test)
}
lateinit을 사용하여 test 변수를 선언해줬고, 이후에 어떤 동작의 결과 값을 기반으로 test를 초기화해주는 것을 확인할 수 있습니다.
또, lateinit은 var을 사용하기 때문에 값이 계속 변경되는 것을 확인할 수 있습니다. ( val 사용 불가 )
만약 lateinit을 사용해 놓고 늦은 초기화 조차 하지 않는다면 컴파일 단계에서 오류가 발생하기 때문에
위 두 번째에서 말한 잠재적 오류를 방지해 줄 수 있습니다.
lateinit은 Primitive Type (Int, Float, Double, Long 등)을 사용할 수 없습니다!
📑by lazy
by lazy는 이렇게 사용할 수 있습니다.
fun main() {
// lateinit 으로 값을 늦게 초기화 해줌
lateinit var text: String
// by lazy로 값을 초기화해주고 정의
val str: String by lazy { "${text.length}" }
text = "Jucoding"
println(str)
}
by lazy와 lateinit을 활용해 보았습니다. 조금 이상한 점은 by lazy 뒤에 생성자를 넣어 주었다는 것입니다.
그 이유로 by lazy는 str 변수를 사용 시에 어떤 값이 들어가는지 정의를 해 줘야 하기 때문입니다.
by lazy는 선언 당시에는 초기화를 할 수 없습니다.
위 코드를 자세히 보면 lateinit이라서 아직 초기화되지 않은 text 의속성을 활용해 주었습니다.
즉, 선언 당시에는 초기화를 할 수 없지만 호출 시 어떠한 값을 어떻게 초기화해 줄지 정의해 줄 수 있습니다.
by lazy는 lateinit과 다르게 val로 선언이 되어있습니다. 이 뜻은 딱 한번 늦은 초기화가 이루어지고 이후에는 값을 변경할 수 없다는 것을 보장해주기 때문입니다.
📗결론 3줄 요약
결국 lateinit과 by lazy는 늦은 초기화를 하기 위해 탄생하였습니다.
하. 지. 만
lateinit은 초기화 이후 계속하여 값이 바뀔 수 있습니다. ( var 사용 )
by lazy는 초기화 이후에 읽기 전용 값으로 사용할 수 있습니다. ( val 사용 )
'Android Studio > - Programming' 카테고리의 다른 글
[안드로이드] 액티비티 생명주기 ( Activity Lifecycle ) (0) | 2024.04.24 |
---|---|
[안드로이드/Regex] 정규표현식, 회원가입 유효성 검사 (0) | 2024.04.08 |
[코틀린/OOP] OOP (객체지향 프로그래밍) 란 무엇인가? (0) | 2024.03.25 |
[코틀린] Abstract class와 Interface 차이점 (0) | 2024.03.19 |
[안드로이드/Radius] 레이아웃 둥글게 만들기 (2) | 2024.03.06 |
주코딩의 개발 노트!
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!