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에러를 만나게 됩니다. 😥

image

오류를 방지하기 위해서 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/

💻 https://mangkyu.tistory.com/70

카테고리:

업데이트:

댓글남기기