1. 지연 초기화
코틀린은 지연 초기화를 사용하는데 이는 클래스의 코드에 Nullable 처리가 남용되는 것을 방지해 줌
1) lateinit
개발을 하다 보면 클래스 안에서 변수(프로퍼티)만 Nullable로 미리 선언하고 초기화(생성자 호출)를 나중에 해야 할 경우가 있는데, 이럴 경우 lateinit 키워드를 사용할 수 있음
Nullable로 선언하는 일반적인 방법
👾 일반적인 선언 방식으로 처음에 null 값을 입력해두고, 클래스의 다른 메서드 영역에서 값을 입력함
class Person {
var name: String? = null
init {
name = "Jane"
}
fun process() {
name?.plus(" Messi")
println("이름의 길이 = ${name?.length}")
println("이름의 첫글자 = ${name?.substring(0, 1)}")
}
}
📍 이 방식은 변수에 입력된 값의 메서드나 프로퍼티를 사용할 때 Safe Call(?.)이 남용되어 가독성을 떨어트리는 문제가 있음
lateinit을 사용하는 방법
👾 lateinit을 사용하면 Safe Call을 쓰지 않을 수 있기 때문에 코드에서 발생할 수 있는 수많은 ?를 방지할 수 있음
class Person2 {
lateinit var name: String
init {
name = "Jane"
}
fun process() {
name.plus(" Messi")
println("이름의 길이 = ${name.length}")
println("이름의 첫글자 = ${name.substring(0, 1)}")
}
}
lateinit의 특징
✓ var로 선언된 클래스의 프로퍼티에서만 사용할 수 있음
✓ null 은 허용되지 않음
✓ 기본 자료형 Int, Long, Double, Float 등은 사용할 수 없음
✓ lateinit은 변수를 미리 선언만 해놓은 방식이기 때문에 초기화되지 않은 상태에서 메서드나 프로퍼티를 참조하면 null 예외가 발생해서 앱이 종료. 따라서 변수가 초기화되지 않은 상황이 발생할 수 있다면 Nullable이나 빈 값으로 초기화하는 것이 좋음
2) lazy
👩🏻💻 lazy는 읽기 전용 변수인 val을 사용하는 지연 초기화
👩🏻💻 lateinit이 입력된 값을 변경할 수 있는 반면, lazy는 입력된 값을 변경할 수 없음
👩🏻💻 val로 변수를 먼저 선언한 후 코드의 뒤쪽에 by lazy 키워드를 사용, 그리고 by lazy 다음에 나오는 중괄호 {}에 초기화할 값을 써주면 됨
class Company {
// by lazy를 사용하면 반환되는 값의 타입을 추론할 수 있기 때문에 변수의 타입을 생략할 수 있음.
val person: Person by lazy { Person() }
init {
// lazy는 선언 시에 초기화 코드를 함께 작성 하기 때문에 초기화 과정이 필요없음.
}
fun process() {
println("person은 이름은 ${person.name}") // 최초 호출하는 시점에 초기화.
}
}
lazy의 특징
✓ 선언 시에 초기화 코드를 함께 작성하기 때문에, 따로 초기화 할 필요가 없음
✓ lazy로 선언된 변수가 최초 호출되는 시점에 by lazy{} 안에 넣은 값으로 초기화
✓ 코드에서 Company 클래스가 초기화 되더라도 person에 바로 Person()으로 초기화 되지 않고, process() 메서드에서 person.name이 호출되는 순간 초기화
💡 lazy는 주의해서 사용. 지연 초기화는 말 그대로 최초 호출되는 시점에 초기화 작업이 일어나기 때문에 초기화하는데 사용하는 리소스가 너무 크면 (메모리를 많이 쓰거나 코드가 복잡한 경우) 전체 처리 속도에 나쁜 영향을 미칠 수 있음
[ 내용 참고 : IT 학원 강의 ]
'Programming Language > Kotlin' 카테고리의 다른 글
[Kotlin] 람다식 Lambda Expression (0) | 2024.04.24 |
---|---|
[Kotlin] 제네릭, Nullable, Safe Call, Elvis Operator (0) | 2024.04.23 |
[Kotlin] 접근 제한자 (0) | 2024.04.22 |
[Kotlin] 패키지, 추상화, 인터페이스 (0) | 2024.04.22 |
[Kotlin] 오버라이드, 추상 클래스 (0) | 2024.04.18 |