ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Optional<> 과 Null (이론편)
    JAVA/자바공부 2022. 7. 15. 00:39

    Optional이란 무엇인가

    NullPointer 예외 피할 수 있게 도와주는 클래스.

    값을 갖거나 갖지 않을 수 있는 컨테이너.

     

     

    프로젝트 중에 동료 개발자분 JAVA 코드를 보니 Optional<> 활용이 많더라.

    애초에 JPA 사용할때는 .orElseThrow(() → {new Exception}) 형태로 사용했는데,,

    정신차리고 보니 전부 if 문으로 null 처리를 하고 있었다… if (ㅇㅇ == null) {} .. 요런식 

     

    나도 쓸꺼야… 옵셔널..... 

    Optional.ofNullable(validatioon).orElseGet(() -> new HashMap<>()); 
    Optional.ofNullable(appDTO.getMultipartFile()).ifPresent(app::setMultipartFile);
    Optional.ofNullable(appDTO.getUrl()).isPresent()
    

    Null 참조란 무엇인가

    1965년 영국 Tony Hoare에 의해서 null 참조 등장. (언어 ALGOL)

    “컴파일러가 자동으로 모든 참조가 안전한지 확인하려고.. 값이 없는 상황을 null로 구현”
    
    2009년 발표 중
    "죄송...10억 달러짜리 실수.. null을 창조한건 뼈아픈 실수"
    

     

    구글 이미지

     

    Null은 왜 문제일까?

    • 결정적으로 null 값을 참조할때 Error로 프로그램 실행을 중단 시킨다.
    • null 확인 코드 추가로 가독성이 떨어진다. (null 확인하는 if문, 들여쓰기, 오타, 깜박함)
    • null은 엄밀히 말하자면 의미가 없는 값. 값이 없음을 표현한 것이다.
    • 자바 철학 위배 - 개발자에게 포인터(C 공부해야 알듯..)를 숨겼는데 null point가 유일한 예외
    • 애초에 null로 지정했던 값이 왜 null로 했었는지 기억이 안나게 된다.

    다른 언어에서는 Null 어떻게 처리할까?

    • Groovy - safe navigation operator ?.
      • def carInsuranceName = person?.car?.insurance?.name
      • 값이 있는지 없는지 확인하는 연산자 활용 (safe navigation operator)
    • 하스켈, 스칼라
      • 함수형 언어
      • 값이 있는지 없는지 확인하는 Optional Value = Maybe 형식 제공한다.
      • Maybe는 값을 가질수도 안 가질수도 있는 Optional[T] 구조 제공

    Java 8 Optional<T> 클래스는 이 Optional Value의 방식에 영향받아서 탄생했다.

    java.util.Optional<T>

    Optional 사용시

    • 값이 있으면, 값을 감싼다. (캡슐화)
    • 값이 없으면, Optional.empty 메서드로 Optional (특별한 싱글턴 인스턴스를 반환한다.)

    쓰면 좋은 점?

    • 컴파일러가 null이 올때 이게 올바른 값인지 판단 할 수 없다. → null Point Exception 회피
    • 도메인 모델 의미를 명확하게 한다.
      • 설계 의도를 명확하게 할 수 있다.
      • 값이 없는 상황에서 우리 데이터 문제인지, 알고리즘 문제인지 구분할 수 있다.
    public class Person {
        private Optional<Car> car; // 아! 사람이 차가 있을 수도 없을 수도 있다.
    		public Optional<Car> getCar() {
            return car; 
        }
    } 
    
    public class Car {
    		private Optional<Insurance> insurance; // 차는 보험이 있을 수도 없을 수도 있다.
    		public Optional<Insurance> getInsurance() {
            return insurance; 
        }
    }
    
    public class Insurance {
    		private String name; // 보험 회사 이름은 없어서는 안되지..!!
    		public String getName() {
    		    return name;
        }
    }
    

     

     

    출처: 

     

    https://madplay.github.io/post/java-optional-advanced

    반응형
Designed by Tistory.