위로 아래

Optional

Optional 클래스

  1. null로 인해 발생하는 문제를 줄이고자 자바8부터 도입 (java.util 패키지에 포함)
  2. null을 사용하지 않고 부재 값을 모델링하기 위하여 도입된 클래스
  3. Optional 클래스는 부재(null)값을 포함한 데이터를 저장하는 컨테이너이다.
  4. 종류
    1. Optional 클래스 : 객체를 위한 옵션 타입
    2. OptionalInt, OptionalLong, OptionalDouble 클래스 : 숫자를 위한 옵션 타입

 

Optional 생성

import java.util.*;

public class Optional1Demo {
	public static void main(String[] args) {
		//옵션 타입 생성
		OptionalInt i = OptionalInt.of(100);
		OptionalDouble d = OptionalDouble.of(3.14);
		Optional<String> s = Optional.of("apple");
		
		//옵션 타입 불러오기
		System.out.println(i.getAsInt());
		System.out.println(d.getAsDouble());
		System.out.println(s.get());
		
		System.out.println(i);
		System.out.println(d);
		System.out.println(s);
	}
}

 

 

주요 메소드

  1. empty() : 빈 Optional 객체를 반환
  2. get(), getAsInt() : 값을 반환하며, 없다면 예외 발생
  3. isPresent() : 값의 존재 여부를 true, false로 반환
  4. ifPresent(Consumer) : 값이 있을 때 Consumer에서 처리
  5. of(값) : 주어진 값을 Optional 타입으로 변환
  6. ofNullable(값) : 주어진 값을 Optional 타입으로 변환. 만약 null이라면 빈 Optional을 반환
  7. orElse(값) : 값이 없을 때 디폴트 값을 지정

 

 

empty 예시

더보기
import java.util.*;

public class Optional1Demo {
	public static OptionalDouble divide(double x, double y) {
		return y == 0 ? OptionalDouble.empty() : OptionalDouble.of(x/y);
	}
	
	public static void main(String[] args) {
		System.out.println(divide(1.0,2.0));
		System.out.println(divide(1.0,0.0));
	}
}

 

 

ofNullable(), isPresent(), orElse() 예시

더보기
// print 메소드를 정의하는 Util 클래스 파일
public class Util {
	public static <T> void print(T t) {
		System.out.println(t + " ");
	}
	public static <T> void printWithParenthesis(T t) {
		System.out.println("(" + t + ")");
	}
}
// 메인 페이지
import java.util.Optional;

public class Optional2Demo {
	public static void main(String[] args) {
		String s1 = null;
		Optional<String> o = Optional.ofNullable(s1);
		
		if(s1 != null)
			Util.print(s1);
		else
			Util.print("없음");
		
		if(o.isPresent())
			Util.print(o.get());
		else
			Util.print("없음");
		
		String s2 = o.orElse("없음");
		Util.print(s2);
		
		o.ifPresentOrElse(Util::print, () -> System.out.println("없음"));
	}
}