try-catch를 대체하면서 더 함수형 스타일로 예외를 다룰 수 있음
result<T>는 Kotlin에서 예외 처리를 함수형 스타일로 다루는 클래스
result.fold(...)는 Kotlin에서 주로 Result<T> 타입에 사용되는 함수이며, 성공/실패에 따른 분기 처리를 깔끔하게 해주는 고차 함수
Result가 성공이면 onSuccess, 실패면 onFailure 블록을 실행
마치 "성공했을 때는 이렇게, 실패했을 때는 저렇게 처리해줘" 라고 명확하게 지시하는 것과 같음
전통적인 try-catch보다 더 함수형스럽고 간결함
// 성공/실패 모두 처리해서 하나의 값을 반환 inline fun <R> Result<T>.fold( onSuccess: (value: T) -> R, onFailure: (exception: Throwable) -> R ): R
// 예시
val result: Result<String> = runCatching {
// runCatching = 성공하면 문자열 반환, 실패하면 예외 던짐
fetchDataFromNetwork() // 예시
}
val message = result.fold(
onSuccess = { data -> "Success: $data" },
onFailure = { error -> "Error: ${error.message}" }
)
try-catch를 대체하는 함수
예외가 발생해도 Result로 래핑
성공 → Result.success(value)
실패 → Result.failure(exception)
// 예외를 감싸서 Result<T>를 반환 inline fun <T> runCatching( block: () -> T ): Result<T>
// 예시
val result = runCatching {
fetchDataFromNetwork()
}
성공이면 값 반환, 실패면 null 반환
// 성공이면 값을 반환, 실패면 null fun <T> Result<T>.getOrNull(): T?
// 예시
val result = runCatching { fetchDataFromNetwork() }
val data: String? = result.getOrNull()
성공이면 값 반환, 실패면 지정한 기본값 또는 로직 실행
// 실패면 기본값을 반환 inline fun <R> Result<T>.getOrElse( onFailure: (exception: Throwable) -> R ): R
// 예시
val data = result.getOrElse { "기본값" }
실패했을 때 대체 값을 제공해서 성공으로 전환
// 실패하면 대체값으로 성공 처리 inline fun Result<T>.recover( transform: (exception: Throwable) -> T ): Result<T>
// 예시
val recoveredResult = result.recover {
"오류 발생했지만 대체값 반환"
}
부수 효과(side effect) 처리를 할 때 사용, 값은 그대로 반환
로깅이나 알림용으로 자주 사용
체이닝 가능 (.onSuccess().onFailure())
// 성공 시 side-effect 실행 inline fun Result<T>.onSuccess( action: (value: T) -> Unit ): Result<T>
// 실패 시 side-effect 실행 inline fun Result<T>.onFailure( action: (exception: Throwable) -> Unit ): Result<T>
// 예시
runCatching { fetchDataFromNetwork() }
.onSuccess { println("성공: $it") }
.onFailure { println("실패: ${it.message}") }
| 함수 | 설명 | 반환값 |
|---|---|---|
runCatching | 예외를 Result로 감쌈 | Result<T> |
getOrNull | 성공이면 값, 실패면 null | T? |
getOrElse | 실패 시 기본값 반환 | T |
recover | 실패 시 대체값으로 성공 처리 | Result<T> |
onSuccess | 성공 시 side-effect 실행 | Result<T> |
onFailure | 실패 시 side-effect 실행 | Result<T> |
fold | 성공/실패 모두 처리 후 값 반환 | R |