Java

[Java] Optional<T>, Optional 타입 : 래퍼 클래스, 코드의 복잡성을 낮추다.

디벨로펄 2022. 9. 4.
반응형

Optional<T> 는 지네릭 클래스로 T타입의 객체를 감싸는 래퍼 클래스이다.

Optional 타입에는 모든 타입의 참조변수를 담을 수 있다.

public final class Optional<T> {
	private final T value; // T 타입의 참조변수
    	...
    }
}

* java.util.Optional은JDK 1.8부터 추가됨.

 

장점 : Optional 클래스 사용 시 널 체크를 내부에서 처리하여 코드의 복잡도를 낮출 수 있다. isNull, nonNull, requireNonNull()과 같은 메서드를 통해서! → NullPointerException이 발생하지 않는 코드작성이 가능하다는 이야기이다!

 

관련 Method

- Optional객체 생성

Optional.of(T)

Optional.ofNullable(T)

Optional.empty()

 

- 값 가져오기

optVal.get()

optVal.orElse("대체할 리턴 값");

optVal.orElseGet(Supplier); 

 

- 기타

isEmpty() : 비었는지 확인

isPresent() :  값이 존재하는지 확인

ifPresent(Consumer) : 값이 존재할 경우 액션까지

 

아래는 개인적으로 연습한 코드이다.

String s = "abs";
		Optional<String> optVal = Optional.of(s);
		optVal = Optional.of(s);
		optVal = Optional.ofNullable(null); // null 가능성이 있을 경우
		optVal = Optional.empty(); // 초기화 시에는 null 대신 empty로 초기화!

//		System.out.println(optVal.get()); // empty인 상태에서 get을 하면 NoSuchElementException발생.
		System.out.println(optVal.orElse("null임")); // optVal가 empty일 때 return할 default값 설정
		System.out.println(optVal.orElseGet(String::new));
//		System.out.println(optVal.orElseThrow(NullPointerException::new));
		optVal = Optional.of(s);
		System.out.println(optVal.get());
		System.out.println(optVal.isEmpty());
		System.out.println(optVal.isPresent());

		optVal = Optional.of("123");
		int i = optVal.filter(az -> az.length() > 0).map(Integer::parseInt).orElse(-1);
		optVal =Optional.of("");
		System.out.println("i : " + i);
		int j =  optVal.filter(az -> az.length() > 0).map(Integer::parseInt).orElse(-1);
		System.out.println("j: " + j);
		optVal = Optional.of("ASDFE");
		if(optVal.isPresent()) System.out.println("isPresent() : true"); 
		optVal.ifPresent(System.out::println); // Consumer를 인자로 받는다.
반응형

댓글