본문 바로가기
카테고리 없음

Optional API란?

by 개발초보입니다 2024. 1. 1.

Optional API

자바의 Optional API 는 null값을 다루는 데에 강력한 기능을 제공하는 도구입니다.

이를 통해 코드의 안전성을 높이고 가독성을 향상시킬 수 있습니다.


Optional 클래스

Optional 클래스는 자바 8에서 도입되었으며, 값이 존재할 수도 있고 없을 수도 있는 상황을 처리하기 위한 컨테이너 입니다.

Optional<String> optionalValue = Optional.of("Hello, Optional!");

주요 메서드

  1. of: 주어진 값으로 Optional  객체를 생성합니다.
  2. of:Nullable: 주어진 값으로 Optional 객체를 생성합니다. 값이 null이어도 예외가 발생하지 않습니다.
  3. isPresent: 값이 존재하는지 여부를 확인합니다.
  4. ifPresent: 값이 존재할 경우 주어진 동작을 수행합니다.
  5. orElse: 값이 존재하지 않을 경우 기본값을 반환합니다.
  6. orElseGet: 값이 존재하지 않을 경우 값을 생성하는 함수를 실행하고, 그 값을 반환합니다.

리팩토링과 코드 가독성

기존 코드와의 비교

String result = (nullableValue != null) ? nullableValue : "Default Value";

리팩토링으로 인한 이점

  • 코드가 간결해지며 가독성이 향상됩니다.
  • Optional을 사용함으로써 null 처리를 명시적으로 다룰 수 있습니다.

Optional의 장단점

장점

1. Null 안전성

  • Optional을 사용하면 값이 존재하지 않을 때 발생할 수 있는 NullPointException을 방지할 수 있습니다.
  • 코드에서 명시적으로 Optional을 사용함으로써 null 처리에 대한 안전성이 향상됩니다.

2. 가독성 향상

  • 기존에 삼항 연산자 등을 이용하여 null 체크를 해야했는데 Optional을 사용하면 코드가 간결해지고 가독성이 향상됩니다.
  • 코드의 의도가 더 명확해지므로 유지보수가 용이해집니다.

단점

1. 객체 생성 오버헤드

  • Optional 객체를 생성하는 데에는 약간의 오버헤드가 발생할 수 있습니다.
  • 이는 성능에 영향을 미칠 수 있으며, 성능이 중요한 부분에서는 주의가 필요합니다.

Optional 사용시 권장사항

1. null 체크를 명시적으로 수행

  • Optional을 사용할 때에도 null 체크를 명시적으로 수행하는 것이 중요합니다.
  • 예외적인 상황에 대비하여 적절한 예외 처리를 함께 고려해야 합니다.

2. 코드 리뷰 및 팀 규칙 도입

  • 팀 내에서 Optional 사용에 대한 일관된 규칙을 도입하고 코드 리뷰를 통해 안전한 사용을 유도하세요.
  • 일관된 스타일과 패턴을 사용하면 프로젝트 전반에 걸쳐 가독성을 유지하기 쉬워집니다.

3. 코드 예외 처리

  • Optional 을 사용할 때 예외 처리를 적절하게 고려하세요.
  • 특히 orElseThor 와 같은 메서드를 활용하여 예외를 던지는 방식으로 널 처리에 대한 상황을 명확히 다룰 수 있습니다.

4. 캐싱과 성능 최적화

  • Optional 객체는 생성 오버헤드가 있을 수 있습니다.
  • 반복적으로 사용되는 경우 해당 Optional 객체를 캐싱하여 재사용하는 방식을 고려하여 성능을 최적화할 수 있습니다.

5. 필요한 경우에만 사용

  • Optional은 강력한 기능이지만 항상 사용해야 하는 것은 아닙니다.
  • 특정 상황에서만 사용하여 코드의 명확성을 유지하고 성능 오버헤드를 최소화하세요.

코드 예시

동적 객체 생성

Optional<String> optionalValue = Optional.ofNullable(getValueFromExternalSource());

 

이 코드에서는 Optional을 사용하여 어떤 외부 소스에서 값을 가져와서 그 값을 감싸고 있는 Optional 객체를 생성하고 있습니다.

  • Optional.ofNullable: 이 메서드는 주어진 값이 null이 아니면 해당 값을 감싸는 Optional 객체를 반환하고, 값이 null이면 비어 있는 Optional 객체를 반환합니다.
  • getValueFromExteranlSource(): 이 메서드는 어떤 외부 소스에서 값을 가져오는 가상의 메서드 입니다. 만약 이 메서드가 null을 반환하면, Optional.ofNullable에 의해 비어있는 Optional이 생성됩니다.

설정 파링에서 클래스명 읽기

String className = config.getProperty("class.name");
Optional<Class<?>> myClass = Optional.ofNullable(Class.forName(className));

 

이 코드는 설정 파링에서 읽은 클래스명을 사용하여 Class 객체를 생성하고, 이를 Optional으로 감싸고 있습니다.

  • config.getProperty("class.name"): 설정 파일에서 "class.name"키에 해당하는 값을 읽어 옵니다.
  • Class.forName(className): 읽어온 클래서명에 해당하는 클래스를 동적으로 로딩합니다.
  • Optional.ofNullable: 이 메서드는 클래스를 로딩한 결과가 null이 아니면 해당 클래스를 감싸는 Optional 객체를 반환하고, null이면 비어있는 Optional 객체를 반환합니다.

마무리

Optional API는 자바 프로그래밍에서 null 처리에 대한 안전한 대안을 제공합니다.

올바르게 활용하면 코드의 안전성을 높이고 가독성을 향상시킬 수 있습니다.