lateinit
변수만 Nullable로 미리 선언하고 초기화를 나중에 해야 할 경우
Nullable로 선언하는 일반적인 방법
일반적인 선언 방식으로 처음에 null 값을 입력해두고, 클래스의 다른 메서드 영역에서 값을 입력
위 방식은 변수에 입력된 값의 메서드나 프로퍼티를 사용할 때 Safe Call(?.)이 남용되어 가독성을 떨어트리는 문제가 있다.
lateinit을 사용하는 방법
lateinit을 사용하면 Safe Call을 쓰지 않을 수 있기 때문에 코드에서 발생할 수 있는 수많은 ?를 방지할 수 있어서
가독성이 좋아진다.
lateinit의 특징은 다음 세 가지를 들 수 있다.
1. var로 선언된 클래스의 프로퍼티에만 사용
2. null은 허용되지 않음
3. 기본 자료형 Int, Long, Double, Float 등은 사용할 수 없다.
※lateinit을 사용할 때는 주의할 점 lateinit은 변수를 미리 선언만 해 놓은 방식이기 때문에 초기화되지 않은 상태에서 메서드나 프로퍼티를 참조하면 null 예외가 발생해서 앱이 종료됩니다. 따라서 변수가 초기화되지 않은 상황이 발생할 수 있다면, Nullable이나 빈 값으로 초기화하는 것이 좋다. |
Lazy
lazy는 읽기 전용 변수인 val을 사용하는 지연초기화로
lateinit이 입력된 값을 변경할 수 있는 반면, lazy는 입력값을 변경할 수 없다.
val로 변수를 먼저 선언한 후 코드의 뒤쪽에 by lazy 키워드를 사용하면 된다.
그리고 by lazy 다음에 나오는 중괄호 {} 에 초기화할 값을 써준다.
by lazy를 사용하면 반환되는 값의 타입을 추론할 수 있기 때문에 앞의 코드에서 작성한 person 변수의 타입은 생략할 수 있다.
val person by lazy { Person() }
lazy의 특징
선언 시에 초기화 코드를 함께 작성해서 따로 초기화 할 필요가 없고
lazy로 선언된 변수가 최초 호출된 시점에 by lazy{} 안에 넣은 값으로 초기화 된다.
위의 코드에서 Company 클래스가 초기화 되더라도 person에 바로 Person()으로 초기화되지 않고, process 메서드에서 person.name이 호출되는 순간 초기화 된다.
lazy는 최초 호출되는 시점에 초기화 작업이 일어나서 리소스가 너무 크면 전체 처리속도에 나쁜 영향을 미친다.
'TIL > selfpractice' 카테고리의 다른 글
깃허브 좌충우돌기 (0) | 2024.02.28 |
---|---|
스코프 함수 (1) | 2024.01.19 |
null safety (1) | 2024.01.17 |
클래스와 설계-2 (2) | 2024.01.16 |
클래스와 설계-1 (0) | 2024.01.16 |