Skip to content

Commit d1aba77

Browse files
docs: Kotlin 지연 초기화 문서 고치기
1 parent e582231 commit d1aba77

File tree

1 file changed

+38
-2
lines changed

1 file changed

+38
-2
lines changed

technical-writing.md

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,7 @@ fun loadDataFromServer(): String {
375375
}
376376
```
377377

378-
### 4.2. `by lazy`의 스레드 안전성 모드: `LazyThreadSafetyMode`
378+
### 4.2. 3가지 스레드 안전성 모드: SYNCHRONIZED, PUBLICATION, NONE
379379

380380
`by lazy`의 강력한 기능 중 하나는 스레드 안전성을 쉽게 제어할 수 있다는 점입니다. `lazy()` 함수는 선택적으로 `LazyThreadSafetyMode`를 인자로 받습니다.
381381

@@ -387,6 +387,14 @@ public enum class LazyThreadSafetyMode {
387387
}
388388
```
389389

390+
#### 스레드 안전성 모드 비교
391+
392+
| 모드 | 스레드 안전성 | 성능 | 초기화 실행 횟수 | 사용 시나리오 |
393+
|------|------------|-----|----------------|-------------|
394+
| **SYNCHRONIZED** (기본값) | ✅ 안전 | 중간 (락 사용) | 1회 보장 | 멀티스레드 환경 (일반적) |
395+
| **PUBLICATION** | ✅ 안전 | 높음 (락 없음) | 여러 번 가능 (첫 결과만 사용) | 멱등성 있는 초기화 |
396+
| **NONE** | ❌ 불안전 | 최고 | 상황에 따라 다름 | 단일 스레드 환경만 |
397+
390398
- **`SYNCHRONIZED` (기본값):**
391399
가장 안전한 옵션입니다. 여러 스레드가 동시에 프로퍼티에 접근해도, 락(lock)을 사용해 단 하나의 스레드만 초기화 람다(lambda)를 실행하도록 보장합니다. 다른 스레드들은 초기화가 완료될 때까지 대기했다가 완료된 값을 받습니다. 멀티스레드 환경에서 데이터 일관성이 중요할 때 씁니다.
392400
- **`PUBLICATION`:**
@@ -502,7 +510,35 @@ class ImageLoader {
502510
| **주요 예외** | `UninitializedPropertyAccessException` | X (람다 블록 내 예외는 발생 가능) | `NullPointerException` (`!!` 사용 시) |
503511
| **주요 사용처** | 필드 주입, 생명주기 의존 객체 | 싱글턴, 비용이 큰 `val` | 선택적으로 값이 없거나, 리셋이 필요한 경우 |
504512

505-
### 6.2. 선택을 위한 의사결정 흐름도
513+
### 6.2. 선택을 위한 의사결정 플로우차트
514+
515+
```
516+
┌─────────────────────────────────────┐
517+
Kotlin 지연 초기화 방식 선택하기 │
518+
└──────────────┬──────────────────────┘
519+
520+
521+
┌──────────────┐
522+
│ 값이 불변인가?
523+
│ (val?) │
524+
└──┬───────┬───┘
525+
│ │
526+
Yes No
527+
│ │
528+
▼ ▼
529+
┌─────────┐ ┌──────────────────────┐
530+
│ by lazy │ │ 절대 null이 안 되는가?
531+
└─────────┘ └──┬───────────────┬───┘
532+
│ │
533+
Yes No
534+
│ │
535+
▼ ▼
536+
┌──────────┐ ┌────────────┐
537+
lateinit │ │ Nullable ?
538+
└──────────┘ └────────────┘
539+
```
540+
541+
**단계별 질문:**
506542

507543
1. **값이 불변(Immutable)인가?** → `Yes`: **`by lazy`** 사용.
508544
2. (No) **값이 가변(Mutable)이면서, 절대 `null`이 되지 않음이 보장되는가?** → `Yes`: **`lateinit`** 사용.

0 commit comments

Comments
 (0)