코틀린에서는 특이한 점이 하나 있다. (물론 내가 c#개발을 했었어서일수도 있다.)
int a;
a = 1;
Console.WriteLine(a)
// 1
c#에서는 위와같이 int a를 변수명 선언만 한 뒤 a의 값을 나중에 할당해도 된다.
하지만 코틀린에서는 에러가 발생한다.
이를 해결하기 위해 사용하는 키워드가 바로 lateinit / lazy다.
1. lateinit (kotlin아! 값은 나중에 알려줄께..)
lateinit var name : String
name = "Kim"
println(name)
// Kim
위에서 언급한 C#과 파이썬등 여러 언어들과 동일한 방법이다.
lateinit이라는 키워드로 나중에 값을 할당할것이라고 kotlin에게 알려준 뒤,
필요할 때 값을 넣어주는 방법이다.
여기엔 몇가지 제한 조건이 있다.
- var 변수에만 사용이 가능하다.
- 당연하다. val 타입은 추후에 값을 못바꾸기 때문에 불가능하다.
- nullable 자료형을 사용 할 수 없다.
- 초기화하기 전에 변수를 호출하면 에러가 발생한다.
- 값이 없는 상태이기에 반환 할 값도, 주소도 없다.
- 변수명.isInitialized()로 초기화가 되었는지 확인 가능하다.
- 원시 자료형에는 사용이 불가능하다.
- Int, Double, Float, Bool 등..
2. lazy (미리 값은 알려주는데 내가 값을 넣으라 할때까지 기다려봐)
val lazyVar : String by lazy {
println("초기화 되었습니다 1.")
println("초기화 되었습니다 2.")
"Lazy 키워드"
}
println(lazyVar)
println("------------")
println(lazyVar)
// 초기화 되었습니다 1. // 초기화 동작으로 인한 출력
// 초기화 되었습니다 2. // 초기화 동작으로 인한 출력
// Lazy 키워드 // 초기화 동작으로 인한 출력, "Lazy 키워드" 값이 lazyVar에 할당 / 반환
// ------------
// Lazy 키워드 // lazyVar에 할당된 값 반환
lazy는 val만 사용 가능하다.
다시말해 변경 불가한 값이다.
처음 변수를 선언할때 '나중에 호출하면 이런 값을 할당해줘' 라는 방법(혹은 레시피)를 미리 선언해 놓는다.
위의 코드처럼 println()등도 함께 호출 가능하다.
변수가 호출되는 시점에 초기화가 진행되면서 lazy블록 안에 있는 코드가 실행되고 "Lazy 키워드"라는 값이 lazyVar에 할당된다.
그리고 이후에 호출이 되면 "Lazy 키워드"만 반환된다.
(위의 출력값에 "초기화 되었습니다. 1", "초기화 되었습니다. 2", "Lazy 키워드"가 나오는 부분은 초기화 되면서 실행된 값들이다.)
(맨 마지막줄 "Lazy 키워드"는 초기화가 완료되었기에 다른 문구 없이 lazyVar에 할당된 값만 출력되게 된다.)
용량이 큰 자료를 데이터값으로 사용해야 할때 프로그램 실행시부터 메모리에 올려놓게되면 메모리의 효율성이 떨어진다.
(10년뒤 사용할 휴지100묶음을 지금부터 방에 놔두는 꼴이 된다.)
그래서 필요시에 할당해 사용하기위해 주문서만 만들어놓고 필요할대 주문해 사용하는 방법인것이다.
'안드로이드 앱 만들기 > 코틀린 기초' 카테고리의 다른 글
코틀린의 static, companion (0) | 2024.11.04 |
---|---|
코틀린의 array, list, set, map 차이 비교 (0) | 2024.11.04 |
코틀린의 Switch/Case (When 문법) (0) | 2024.11.03 |