Kotlin의 Result 다룰 때 자주 쓰이는 함수들

Developer💻·2025년 6월 10일

Android

목록 보기
7/10

Kotlin의 Result를 다룰 때 자주 쓰이는 함수들 정리

try-catch를 대체하면서 더 함수형 스타일로 예외를 다룰 수 있음


Result

result<T>는 Kotlin에서 예외 처리를 함수형 스타일로 다루는 클래스


fold()

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}" }
)

runCatching { ... }

try-catch를 대체하는 함수
예외가 발생해도 Result로 래핑
성공 → Result.success(value)
실패 → Result.failure(exception)

// 예외를 감싸서 Result<T>를 반환
inline fun <T> runCatching(
    block: () -> T
): Result<T>
// 예시
val result = runCatching {
	fetchDataFromNetwork()
}

getOrNull()

성공이면 값 반환, 실패null 반환

// 성공이면 값을 반환, 실패면 null
fun <T> Result<T>.getOrNull(): T?
// 예시
val result = runCatching { fetchDataFromNetwork() }
val data: String? = result.getOrNull()

getOrElse { ... }

성공이면 값 반환, 실패면 지정한 기본값 또는 로직 실행

// 실패면 기본값을 반환
inline fun <R> Result<T>.getOrElse(
    onFailure: (exception: Throwable) -> R
): R
// 예시
val data = result.getOrElse { "기본값" }

recover { ... }

실패했을 때 대체 값을 제공해서 성공으로 전환

// 실패하면 대체값으로 성공 처리
inline fun Result<T>.recover(
    transform: (exception: Throwable) -> T
): Result<T>
// 예시
val recoveredResult = result.recover {
	"오류 발생했지만 대체값 반환"
}

onSuccess { ... } / onFailure { ... }

부수 효과(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성공이면 값, 실패면 nullT?
getOrElse실패 시 기본값 반환T
recover실패 시 대체값으로 성공 처리Result<T>
onSuccess성공 시 side-effect 실행Result<T>
onFailure실패 시 side-effect 실행Result<T>
fold성공/실패 모두 처리 후 값 반환R
profile
숲을 그리는 개발자

0개의 댓글