Java java.math 패키지의 Optional 클래스
Optional
는 Java8에서 추가 된 클래스이다. Optional
클래스는 null를 다룰 때 편리한 클래스이므로, 기본적 작성법을 알아보도록 하자.
Optional란
Optional
는 메소드의 반환 값으로 null
을 반환 할 수 있음을 명시적으로 표시하고자 할 때 사용한다. 메소드가 null을 반환 할 수 있음을 나타내는 것으로, 그 메소드를 사용하는 프로그램을 보다 안전하게 구현할 수 있도록 한다.
Optional 선언 방법
Optional
를 사용하려면 형식을 래핑하여 사용한다.
Optional<String> optinoal;
사용자가 만든 클래스에서도 사용할 수 있다.
import java.math.BigDecimal;
public class Foo {
private String str;
private BigDecimal value;
}
Optional<Foo> opt;
Optional 인스턴스 생성
Optional
클래스는 인스턴스 생성의 static
메소드가 제공하고 있어, 이 메소드를 사용해 생성한다.
Optional.empty()
: 값이 null인 Optional 인스턴스를 생성한다.Optional.of(값)
: 인자 값에 대한 Optional 인스턴스 생성한다Optional.ofNullable(값)
: 인자 값이 null의 경우는 empty, null가 아닌 경우는 of 메소드의 결과와 동일하다.
Optional.of
는 아래와 같이 선언 할수 있다.
Optional<String> opt1 = Optional.of("test");
Optional.of
에는 인수가 null의 경우 java.lang.NullPointerException이 발생하므로 주의가 필요하다.
Optional<String> opt1 = Optional.of(null);
그래서 주로 Optional.ofNullable
을 사용한다.
Optional<String> opt1 = Optional.ofNullable("test");
Optional<String> opt2 = Optional.ofNullable(null);
Foo test = new Foo();
Optional<Foo> opt3 = Optional.ofNullable(test);
Optional 반환 메소드 사용 방법
Optional 반환 메소드에 대해서 알아보자.
or 메소드 사용법
or
메서드는 Optional.ofNullable
메소드의 인수로 지정된 객체가 null
의 경우에만 처리를 실행한다.
import java.util.Optional;
public class Sample {
public static void main(String[] args) {
String str = null;
Optional<String> value = Optional.ofNullable(str);
System.out.println(value.or(() -> Optional.of("null입니다.")).get());
}
}
실행 결과:
null입니다.
orEsle 메소드 사용법
Optional.ofNullable
메소드의 인수가 null
의 경우, orElse
메소드의 인수에 값을 반환한다. null
가 아닌 경우는 null
이 아닌 값을 반환한다.
import java.util.Optional;
public class Sample {
public static void main(String[] args) {
String str = null;
Optional<String> value = Optional.ofNullable(str);
str = value.orElse("null입니다.");
System.out.println(str);
}
}
실행 결과:
null입니다.
orElseGet 메소드 사용법
Optional.ofNullable
메소드의 인수가 null의 경우, orElseGet
메소드의 suppelier 결과를 반환한다. null가 아닌 경우는 null이 아닌 값을 반환한다.
import java.util.Optional;
public class Sample {
public static void main(String[] args) {
String str = null;
Optional<String> value = Optional.ofNullable(str);
str = value.orElseGet(Sample::getDefaultValue);
System.out.println(str);
}
private static String getDefaultValue(){
return "Default 입니다.";
}
}
실행 결과는 아래와 같다.
Default 입니다.
orElseThrow 메소드 사용법
orElseThrow
메서드는 인수의 있고 없고에 따라 처리가 다르다. 인수가 없는 경우는 null
의 경우 NoSuchElementException
를 throw
하고, null
이 아닌 경우는 값을 돌려 준다.
import java.util.NoSuchElementException;
import java.util.Optional;
public class Sample {
public static void main(String[] args) {
String str = null;
Optional<String> value = Optional.ofNullable(str);
try {
str = value.orElseThrow();
System.out.println(str);
} catch (NoSuchElementException ex) {
System.out.println("null입니다.");
}
}
}
실행 결과:
null입니다.
인수가 있는 경우에는 Throw
를 통해 예외 클래스의 객체를 지정할 수 있다.
import java.util.Optional;
public class Sample {
public static void main(String[] args) {
String str = null;
Optional<String> value = Optional.ofNullable(str);
try {
System.out.println(value.orElseThrow(() -> new RuntimeException()));
} catch (RuntimeException e) {
System.out.println("null입니다.");
}
}
}
실행 결과:
null입니다.
ifPresent 메소드 사용법
null
이 아닌 경우에만 인수에 지정된 작업을 실행한다.
import java.util.Optional;
public class Sample {
public static void main(String[] args) {
String str = null;
Optional<String> value = Optional.ofNullable(str);
value.ifPresent(System.out::println);
}
}
실행을 하면 str
가 null
이기에 아무것도 처리되지 않는다.
ifPresentOrElse 메소드 사용법
null의 경우에도 처리를 할 수 있다. null가 아닌 경우의 처리를 첫번째 인자에 지정하고, null의 경우의 처리를 두번째 인자에 지정한다.
import java.util.Optional;
public class Sample {
public static void main(String[] args) {
String str = null;
Optional<String> value = Optional.ofNullable(str);
value.ifPresentOrElse(
System.out::println,
() -> System.out.println("null입니다"));
}
}
실행 결과:
null입니다.