Java 8 버전 부터 등장한 기능이다.
null
이 발생하게 되면 NullPointerException
또한 발생하게 되므로 null
값 검증을 해줘야만 한다.
if (age != null) {
service.check(age);
}
이런 검증 코드를 작성하게 되는 경우 변수가 많아지거나 경우의 수가 많아지면 작성 해야하는 코드가 길어지는 불편함이 존재한다.
null
이 올 수 있는 값을 감싸는 래퍼 클래스
래퍼 클래스에 값을 저장하기 때문에 만약 null
이 발생하더라도 NullPointerException
이 발생하지 않는다.
Optional
을 사용하기 위해서는 Optional
객체를 생성해야 한다.
먼저 기본 문법에 관해 알아보자.
.of()
, .ofNullable()
로 해당 객체 생성이 가능하다.
//Optional 사용하기
Type 변수명1;
Optional<String> 변수명2 = Optional.of(변수명1);
Optional<String> 변수명2 = Optional.ofNullable(변수명1);
- of 와 ofNullable 은 다르다!
.of()
: 값이 절대null
이 아닌 경우에 사용
.ofNullable()
: 값이null
일 수도,null
이 아닐 수도 있는 경우에 사용
of()
를 null
인 경우 사용하면 NullPointerException
이 발생한다.
.ofNullable()
로 객체를 생성한 뒤 출력해보자.
String t = null;
Optional<String> name = Optional.ofNullable(t);
System.out.println(t);
//출력 : Optional.empty
null
이 데이터임에도 불구하고 NullPointerException
이 발생하지 않은 것을 확인할 수 있다.
.isPresent()
를 사용하여 데이터의 존재 여부를 확인해보자.
String t = null;
Optional<String> name = Optional.ofNullable(t);
System.out.println(name.isPresent());
//출력 : false
t
의 값이 null
이므로 데이터는 존재하지 않는다. 따라서 false가 반환된다.
이번에는 t
에 [ apple ] 데이터를 넣은 뒤 다시 출력해보자.
String t = "apple";
Optional<String> name = Optional.ofNullable(t);
System.out.println(name.isPresent());
//출력 : true
null
이 아니므로 true가 반환되어 출력되었다.
t
가 null
이 아니면 문자열의 길이를 출력하는 메서드를 작성해보자.
String t = "apple";
if( t != null ) {
System.out.println(t.length());
}
//출력 : 5
if문을 사용하여 t
의 null
검증을 해야하기 때문에 변수가 많아지게 되면 코드가 길어지는 단점이 생긴다.
이런 경우 .ifPresent()
와 람다식을 이용하여 if문을 작성할 수 있다.
String t = "apple";
Optional<String> name = Optional.ofNullable(t);
opt.ifPresent( v -> System.out.println(v.length()) );
//출력 : 5
null
검증시 필요한 if문 작성의 번거로움을 줄일 수 있는 장점이 있다.
.orElse()
는 값이 null
인 경우에만 parameter로 받아온 값을 반환한다.
아무 과일도 선택하지 않으면 자동으로 복숭아를 출력하게 해보자.
apple
선택String t = "apple";
Optional<String> name = Optional.ofNullable(t);
System.out.println(name.orElse("peach"));
//출력 : apple
Null
String t = null;
Optional<String> name = Optional.ofNullable(t);
System.out.println(name.orElse("peach"));
//출력 : peach
데이터가 null
인 경우에만 .orElse()
가 실행되는 것을 확인할 수 있다.