2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

코틀린의 lateinit과 lazy의 차이는 무엇인가요?

_____
Q1: `lateinit`이란 무엇인가요?
A1: `lateinit`는 코틀린에서 초기화를 나중에 할 수 있는 `var` 변수에 사용하는 키워드입니다. 변수 선언 시 초기값을 지정하지 않고, 나중에 반드시 초기화해야 하며, 주로 널이 될 수 없는(var, non-nullable) 참조 타입에 사용 됩니다.

---

Q2: `lazy`란 무엇인가요?
A2: `lazy`는 변수의 초기화를 실제로 해당 변수에 접근하는 시점(최초 호출 시점)에 수행 하는 지연 초기화(delegate) 방식입니다. 주로 `val` 변수에 사용 하며, 초기화 블록을 람다로 전달합니다. 초기화는 한 번만 수행되고 결과가 캐싱됩니다.

---

Q3: `lateinit`와 `lazy`의 주요 차이점은 무엇인가요?
A3:
- `lateinit`은 `var` 변수 에 사용하고, 초기화를 직접 코드에서 나중에 수행 해야 하며, 초기화 전 변수 사용 시 예외(`UninitializedPropertyAccessException`)가 발생합니다.
- `lazy`는 `val` 변수 에 사용하며, 접근할 때 자동으로 초기화 되고, 초기화 코드를 람다로 제공하며, 최초 한 번만 초기화가 됩니다.

---

Q4: `lateinit`는 어떤 타입에 사용할 수 있나요?
A4: 오직 널이 될 수 없는(non-nullable) 참조 타입(클래스, 인터페이스 등)에만 사용 할 수 있습니다. 기본 자료형(`Int`, `Double` 등)에는 사용할 수 없습니다.

---

Q5: `lazy`는 어떤 상황에서 주로 사용되나요?
A5: 초기화 비용이 큰 객체를 필요할 때까지 미루고 싶을 때 , 또는 객체 생성이 불필요할 수도 있을 때 사용합니다. 예: 데이터베이스 연결, 무거운 계산 결과 등.

---

Q6: `lateinit` 변수 초기화 여부를 어떻게 확인하나요?
A6: `::변수명.isInitialized` 프로퍼티를 통해 초기화 여부를 확인할 수 있습니다.

예:
```kotlin
if (::myVar.isInitialized) {
// 초기화됨
} else {
// 초기화 안됨
}
```

---

Q7: `lazy` 변수의 초기화는 몇 번 발생하나요?
A7: 최초 접근 시 한 번만 초기화되고, 이후에는 캐시된 값을 계속 재사용합니다.

---

Q8: `lateinit` 사용 시 주의할 점은?
A8: 초기화를 꼭 해주어야 하고, 초기화 전에 접근하면 `UninitializedPropertyAccessException`이 발생할 수 있기 때문에 사용 전에 반드시 초기화 여부를 확인하거나 초기화 상태를 보장해야 합니다.

---

Q9: `lazy`를 사용할 때의 기본 스레드 안전성은?
A9: 기본 `lazy`는 스레드 안전 합니다 (`LazyThreadSafetyMode.SYNCHRONIZED`가 기본값). 필요에 따라 `LazyThreadSafetyMode.PUBLICATION` 또는 `LazyThreadSafetyMode.NONE`을 지정할 수 있습니다.

---

요약
| 구분 | lateinit | lazy |
|----------------|--------------------------------|---------------------------------------|
| 적용 타입 | nullable 아닌 참조타입(var) | val (불변) 타입 |
| 초기화 시점 | 선언 후 별도 코드에서 초기화 | 사용 시점에 자동 초기화 |
| 지연 초기화 방식| 강제 후 초기화 | 필요 시점에 one-time 초기화 |
| 예외 발생 | 초기화 전 접근 시 예외 발생 | 초기화 코드가 지연 실행되어 안전 |
| 스레드 안전성 | 없음 (사용자 책임) | 기본적으로 스레드 안전 |

---

이로써 `lateinit`과 `lazy`의 차이와 사용법을 이해할 수 있습니다.
코틀린(Kotlin)에서는 변수를 초기화하는 방법으로 `lateinit`과 `lazy`를 제공하고 있습니다.

이 두 가지는 각각의 용도와 특성이 다르기 때문에, 상황에 맞게 적절히 선택하여 용하는 것이 중요합니다.

아래에서 `lateinit`과 `lazy`의 차이점에 대해 자세히 설명하겠습니다.

1. `lateinit` `lateinit`은 변수를 나중에 초기화할 것임을 명시하는 키워드입니다.

주로 `var`로 선언된 가변 변수에 사용되며, 초기화가 지연되지만, 반드시 나중에 초기화해야 합니다.

`lateinit`을 사용할 수 있는 조건은 다음과 같습니다: - 변수는 `var`로 선언되어야 합니다.

- 기본형(Primitive Type)에는 사용할 수 없습니다.

즉, `Int`, `Double`, `Boolean` 등과 같은 기본형 타입에는 사용할 수 없습니다.

- 변수를 사용하기 전에 반드시 초기화해야 하며, 초기화되지 않은 상태에서 접근하면 `UninitializedPropertyAccessException`이 발생합니다.

예시: ```kotlin class Example { lateinit var name: String fun initializeName() { name = "Kotlin" } fun printName() { if (::name.isInitialized) { println(name) } else { println("Name is not initialized") } } } ``` 위의 예시에서 `name` 변수는 `lateinit`으로 선언되어 있으며, `initializeName` 메서드를 통해 나중에 초기화됩니다.

`printName` 메서드에서는 `isInitialized`를 사용하여 변수가 초기화되었는지 확인할 수 있습니다.



2. `lazy` `lazy`는 변수를 처음 사용할 때 초기화하는 지연 초기화(lazy initialization)를 제공합니다.

`lazy`는 `val`로 선언된 불변 변수에만 사용할 수 있으며, 초기화는 스레드 안전(thread-safe)하게 이루어집니다.

즉, 여러 스레드에서 동시에 접근하더라도 안전하게 초기화됩니다.

`lazy`는 다음과 같은 특징을 가지고 있습니다: - `val`로 선언된 변수에만 사용할 수 있습니다.

- 초기화는 변수가 처음으로 사용될 때까지 지연됩니다.

- 초기화 블록은 한 번만 실행되며, 이후에는 캐시된 값을 반환합니다.

예시: ```kotlin class Example { val name: String by lazy { println("Initializing name") "Kotlin" } fun printName() { println(name) } } ``` 위의 예시에서 `name` 변수는 `lazy`로 선언되어 있으며, `printName` 메서드가 호출될 때 처음으로 사용되면 초기화됩니다.

초기화 블록이 실행되며, 이후에는 캐시된 값이 반환됩니다.



3. 주요 차이점 요약 | 특성 | `lateinit` | `lazy` | |------------------|----------------------------------|------------------------------------| | 선언 방식 | `var`로 선언 | `val`로 선언 | | 초기화 시점 | 나중에 명시적으로 초기화 필요 | 처음 사용될 때 자동으로 초기화 | | 기본형 사용 가능 여부 | 불가능 | 불가능 | | 초기화 여부 확인 | `isInitialized`로 확인 가능 | 항상 초기화된 상태로 사용 가능 | | 스레드 안전성 | 스레드 안전하지 않음 | 스레드 안전함 | 결론 `lateinit`과 `lazy`는 각각의 상황에 맞게 사용해야 합니다.

`lateinit`은 나중에 초기화할 필요가 있는 가변 변수에 적합하며, `lazy`는 초기화가 지연되어야 하는 불변 변수에 적합합니다.

이 두 가지를 적절히 활용하면 코틀린에서 더 안전하고 효율적인 코드를 작성할 수 있습니다.

작성자: 이주안 [비회원] | 작성일자: 1년 전 2024-09-09 09:47:18
조회수: 148 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.