ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 람다와 스트림 - Optional<T>
    백엔드/자바 2023. 4. 17. 00:38

    그림 1

     

    그림 2

     

    그림 1과 같은 코드가 있다고 가정해보자. 만약 저 상태로 실행한다면 그림 2와 같은 결과를 확인할 수 있다.

     

    변수 nul은 null을 가지고 있기 때문이다. 그렇다면 이 코드에서 NullPointException이 발생하지 않도록 해보자.

     

     

     

    아주 간단하게 나타나면 위와 같은 코드로 나타낼 수 있을 것이다.

     

    물론 이건 한줄짜리 코드라 간단해보이지만 코드가 길어진다면 null체크 코드만으로도 복잡해보일 것이다.

     

    만약 이걸 더 깔끔하게 나타내려면 어떻게 해야할까?

     

     

     

    바로 Optional 클래스를 사용해주면 된다.

     

    Optional<T>는 지네릭 클래스로서 모든 타입의 참조 변수를 감싸는 래퍼 클래스다.

     

    위의 코드에서 확인해보면 알겠지만 Optional 타입의 변수가 String타입의 변수를 저장한 것을 볼 수 있다.

     

     

     

    이를 그림으로 나타내면 위와 같을 것이다.

     

    Optioanl 클래스는 모든 참조 변수 객체를 그림과 같이 감싸서 활용할 수 있도록 도와준다.

     

    그런데 여기서 한 가지 의문이 든다. 단순히 if문을 간략하게 하기 위해서 Optional 클래스를 만든 것일까?

     

    답은 아니다. 사실 Optional<T> 클래스는 null을 다루기 위해서 만들어졌다.

     

    자바를 실습하다보면 알겠지만 NullPointException 오류를 한번쯤은 경험해봤을 것이다.

     

    이때 이러한 null을 래퍼클래스의 형식으로 편리하게 다루기 위해 만들어진 것이 Optional 클래스다.

     

    Optional 객체의 생성 - of(), ofNullable()

     

    Optional 객체를 생성하기 위해선 크게 두 가지 방법이 있는데 바로 of()와 ofNullable()를 쓰는 것이다.

     

    Optioanl은 static 클래스로서 new 연산자 없이도 객체를 사용할 수 있고 of()와 ofNullable() 바로 이용 가능하다.

     

    그렇다면 여기서 굳이 왜 객체 생성 방법을 of()와 ofNullable() 둘로 나눴는지 의문이 들 것이다.

     

    간단히 설명하자면 of()의 경우 null 값을 인자로 받지 않는다. 반면 ofNullable()은 null값을 인자로 받을 수 있다.

     

    즉 코드 작성시 null값이 들어올 가능성이 있다면 ofNullable()을 사용하는 것이 좋다.

     

    Optional 객체의 초기화

     

    만약 코드를 작성하다가 Optioanl 객체를 초기화해야할 일이 있다면 empty()를 쓰는 것이 좋다.

     

    empty()의 경우 위의 결과에서 볼 수 있다시피 아무값이 없는 null과 달리 문자열 출력되는 것을 볼 수 있다.

     

    Optional 객체의 값 반환하기

     

    이전 단락에선 Optional 객체를 생성하는 방법을 배웠다면 이제는 객체가 가진 값을 반환받는 방법을 알아보자.

     

    Optional 객체의 값 반환과 관련된 메서드는 크게 4가지가 있다.

     

    - get() : 단순히 객체가 가진 값을 반환

    - orElse() : 객체가 가진 값이 null일 경우 인자로 전달된 값 반환

    - orElseGet() : 객체가 가진 값이 null이면 인자로 전달된 람다식 반환

    - orElseThrow(): 객체가 가진 값이 null일 경우 인자로 전달한 오류를 발생

     

    사실 코드와 설명만 봐도 간단하게 내용은 다 파악이 가능할 것이다.

     

    이때 주의할 것은 get() 메서드는 단순히 객체가 가진 값을 반환하므로 잘 쓰이지 않는다는 점이다.

     

     

     

    무슨뜻이냐면 get()의 경우 Optioanl 객체가 가진 값을 단순하게 반환하기만 한다.

     

    그렇기 때문에 위의 코드와 결과값처럼 결국 Optional 객체가 null값을 갖게 된다면 오류가 난다.

     

    그럼 애초에 인자값으로 null이 안들어오게 하면 되지 않나 생각할 수 있다.

     

    근데 생각해보면 우리는 null을 간편하게 다루기 위해 Optional 클래스를 쓰는것이다.

     

    근데 굳이 그렇게 null값이 들어오지 않도록 처리해주는게 무슨 의미가 있을까.

     

    차라리 위의 다른 메서드 orElse() 혹은 orElseGet()를 사용하는 것이 훨씬 낫다고 볼 수 있다.

     

    참고로 orElseGet()의 경우는 인자로는 Supplier인터페이스의 람다식이 전달되어야 한다.

     

    즉 입력값 없이 출력값만 있는 람다식을 인자로 주어야 한다.

     

    Optioanl 객체 기타 활용

     

    별로 대단한 내용은 아니지만 알아두면 편리한 메서드들이다.

     

    - isEmpty() : 해당 메서드는 Optional 객체의 값이 비었는지 확인 하는 것. 값이 없다면 true를 반환한다.

    - isPresent() : isEmpty()의 반대되는 메서드. 값이 존재하면 true를 반환한다.

    - ifPresent() : 만약 Optional 객체의 값이 존재한다면 출력.

Designed by Tistory.