Optional
Optional이란?
null값이 들어가도 오류가 나지 않게 값을 감싸는 wrapper class로 null이 들어간 값을 참조해도 NullPointerException가 발생하지 않도록 함수를 사용할 수 있습니다. 또 null을 검사하는 로직을 추가할 필요가 없어 편리합니다. 단, 값을 wrapping 했다 풀었다하는 작업이 성능을 저하시키므로 반환값이 반드시 존재할 땐 사용하지 않아야 합니다.
사용방법
그렇다면 예를 들어 사용법을 알아보도록 하겠습니다. 아래와 같은 List값이 있다고 가정해 봅시다.
List<String> list = new ArrayList<>();
list.add("영희");
list.add("철수");
list.add("미미");
List<String> NPE = null;
System.out.println(list.get(0));
System.out.println(NPE.get(0));
list의 0번째 값을 출력하면 “영희”가 나옵니다. 하지만 NPE의 경우엔 NullPointerException에러를 만나게 됩니다. 😥
오류를 방지하기 위해서 try catch문 또는 조건문으로 null값을 체크하고 만약 null 값일 시 “값이 없다”가 출력되도록 코드를 짜보겠습니다.
1. try catch문
try{
System.out.println(NPE.get(0));
} catch (Exception e){
e.printStackTrace();
System.out.println("값이 없다");
}
2.조건문
조건문에 != null만 하면 [] 또는 ““일 때 거르지 못하고 NullPointerException오류가 날 수 있기 때문에 && !NPE.isEmpty()를 추가해주셔야 합니다.
if(NPE != null && !NPE.isEmpty()) {
System.out.println(NPE.get(0));
}else{
System.out.println("값이 없다");
}
그러면 NullPointerException에러 대신 “값이 없다”가 출력되는 걸 보실 수 있습니다. 그런데 위 코드들은 Optional로 짠 코드에 비해
길고 비효율적입니다.
3.Optional
Optional의 경우 ofNullable()로 변수가 null값인지 체크하고 orElseGet()로 null이라면 어떤 값을 넣어줄지까지 입력할 수 있습니다.
System.out.println(Optional.ofNullable(NPE.get(0)).orElseGet("값이 없다"));
4.orElseGet() VS orElse();
사실 Optional에 null값이 들어간 경우 다른값을 넣어주는 함수가 또 하나 존재합니다. orElseGet()에서 get을 뺸 orElse()함수입니다. 다만 둘은 아래와 같은 차이가 있습니다.
orElseGet() | orElse() |
---|---|
Optional의 값이 null인 경우만 호출 | null인지 상관 없이 항상 호출 |
자원소모가 덜함, 불필요한 문제 발생 안함 | 자원소모적, 추가적인 문제발생 가능성 |
그러므로 값이 미리 존재하지 않는 경우엔 orElseGet()를, 값이 존재하는 경우엔 orElse()를 사용하는 것이 좋습니다.
참조
💻 https://futurecreator.github.io/2018/08/14/java-8-optional/
댓글남기기