본문 바로가기
  • Adillete
【Java】

Result<V,E extends Throwable> 정리

by 아딜렛 2026. 4. 25.
Java Result 타입 정리

Java Result 타입 정리

Result 타입 존재 여부

Java 에러 처리 방식

Result 필요 이유

기본 구조

Success 구현

Failure 구현

함수형 확장 필요성

map 함수
Java 21 표준 라이브러리에는 Result<T, E> 타입이 존재하지 않는다. 필요하면 직접 구현하거나 외부 라이브러리를 사용해야 한다.

Java는 기본적으로 정상 흐름은 return, 실패 흐름은 Exception throw 방식으로 설계되어 있다. Result는 값을 통해 성공/실패를 표현하는 방식이다.

Result는 예외 대신 실패를 값으로 다루고 싶을 때 사용한다. 특히 함수형 스타일에서 체이닝 처리를 위해 사용된다.

기본 구조는 sealed interface를 사용하여 Success와 Failure를 제한적으로 구현한다.

public sealed interface Result<T, E extends Throwable>
    permits Success, Failure {

    boolean isSuccess();
    T get() throws E;
    E getError();
}
        
Success는 성공 값을 가지며 get 호출 시 값을 반환한다.

public final class Success<T, E extends Throwable>
        implements Result<T, E> {

    private final T value;

    public Success(T value) {
        this.value = value;
    }

    public boolean isSuccess() {
        return true;
    }

    public T get() {
        return value;
    }

    public E getError() {
        throw new IllegalStateException("No error");
    }
}
        
Failure는 에러를 가지며 get 호출 시 예외를 던진다.

public final class Failure<T, E extends Throwable>
        implements Result<T, E> {

    private final E error;

    public Failure(E error) {
        this.error = error;
    }

    public boolean isSuccess() {
        return false;
    }

    public T get() throws E {
        throw error;
    }

    public E getError() {
        return error;
    }
}
        
Result는 단순 구조만으로는 실용성이 부족하며, 함수형 스타일 확장이 필요하다.

map 함수는 성공 값에만 함수를 적용하고, 실패는 그대로 유지한다.

default <U> Result<U, E> map(Function<T, U> mapper) {
    if (this instanceof Success<T, E> s) {
        return new Success<>(mapper.apply(s.get()));
    }
    return (Result<U, E>) this;
}
        
Result 타입은 Java 기본 기능이 아니며 직접 구현해야 한다. Success와 Failure 구조로 나누어 값을 통해 성공과 실패를 표현한다. 실전에서 사용하려면 map과 같은 함수형 확장이 필수이다.

'【Java】' 카테고리의 다른 글

[Redis]원자적 락  (0) 2026.07.20
멱등성(Idempotency)이 결제 시스템에 필수인 이유  (0) 2026.07.16
함수형 예외처리  (1) 2026.04.23
Optional  (0) 2026.04.22
불변성  (0) 2026.04.20