자바 기본 - Optional

Posted by : at

Category : java-basic


if(Object object != null)

평소 내가 null처리하는 방식이었다. 규모가 커지는 프로젝트를 해보고 또한 자바 라이브러리를 만들다보니 위 방식으로는 가끔 null 처리를 놓치는 경우도 있었고 코드도 많이 지저분해졌다. 효과적인 null 처리 방식이 필요하다는 생각에 Optional 클래스 사용법을 정리해야겠다는 다짐을 했다.

Optional이란?

자바 8에 Optional이라는 새로운 클래스가 제공되었다. 하나의 객체를 Optional 클래스로 감싸는 것인데 이름에서부터 느낄 수 있듯이 Optional 클래스는 두가지 선택 사항을 제공한다.

  1. 값이 존재했을 때의 행동
  2. 값이 없을 때의 행동 (null)

Optional로 감싸주면 명시적으로도 값이 없을 수 있음을 보여주고 개발자는 이에 따라 대비를 할 수 있다.


Optional 객체 만들기

  • 빈 Optional 만들기

      Optional<T> option = Optional.empty();
    
  • null이 아닌 값으로 Optional 만들기

      Optional<T> option = Optional.of(object);
    

    object가 null이라면 바로 exception이 발생한다. (Optional을 사용하지 않았다면 프로퍼티에 접근했을 때 exception이 발생한다.

  • null값으로 Optional 만들기

      Optional<T> option = Optional.ofNullable(object);
    

프로퍼티에 접근하는 방법 (맵으로 값을 추출하자.)

만약 학생이라는 객체에서 이름을 빼온다고 예를 들어보자.

public class Student(
	private String name;

	public String getName(){
		return this.name;
	}
)

만약 이 클래스를 갖고 이름을 출력할 때 nullPointerException이 발생할 가능성이 두가지 가능성이 있다.

  1. Student 객체가 비어있을 경우
  2. name 필드값이 비어있을 경우

어떻게 안전하게 데이터를 건들 수 있을까?

  • 일단 Student를 Optional 클래스로 감싸서 map() 메서드를 사용하면 된다. (return은 Optional로 wrapping된다.)

      Optional<Student> student;
      Optional<String> name = student.map(Student::getName);
    

    **이미 Optional로 wrappping된 객체를 갖고 오고 싶다면 flatMap을 사용한다.


Optional Unwrapping


filter 하는 방법

만약 “김”씨로 시작하는 학생의 정보에서 주소를 가져온다고 가정을 해본다.(학생의 이름과 주소는 필수값으로 가정한다) 여기서는 학생 객체가 존재하지 않을 경우를 대비해 코딩을 해야한다.

기존 null 처리 방식 :

if(student != null && student.getName.startsWith("김")){
	System.out.println(student.getAddress());
}

이것을 Optional클래스를 사용해보겠다.

Optional<Student> student = ...;
student.filter(std -> std.getName().startsWith("김"))
				.ifPresent(std -> System.out.println(student.getAddress());

About Dani
Dani

많은 것을 배우고 싶은 사람

Email : bomdani9302@gmail.com

Website : https://qhals321.github.io

About 다니

많은 것을 배우고 나누고싶은 사람

Useful Links