[Java] Type


Int vs Integer

  • Int

자료형

산술 연산 가능

null 로 초기화 할 수 없음

  • Integer

Wrapper 클래스

unboxing하지 않으면 산술 연산이 불가능 하지만, null값을 처리할 수 있다.

Boxing : 자료형 -> Wrapper 클래스

Unboxing : Wrpper 클래스 -> 자료형

/* 자바에서는 거의 자동으로 변환해줌

Optional

java.util.Optional Optional 클래스는 Integer나 Dolbue 클래스처럼 T타입의 객체를 포장해주는 래퍼 클래스이다. 따라서, Optional인스턴스는 모든 타입의 참조 변수를 저장할 수 있다.

이러한 Optional 객체를 사용하면 예상치 못한 NullPointerException 예외를 제공되는 메소드로 간단히 회피할 수 있다.

즉, 복잡한 조건문 없이도 널(null) 값으로 인해 발생하는 예외를 처리할 수 있게 됩니다.

라이브러리 메서드가 반환할 결과값이 없음을 명백하게 표현할 필요가 있는 곳에서 제한적으로 사용 할 수 있는 메커니즘

메서드가 반환할 결과값이 ‘없음’을 명백하게 표현할 필요가 있고, null을 반환하면 에러를 유발할 가능성이 높은 상황에서 메서드의 반환 타입으로 사용하는 것이 주된 목적.

Use

orElse()

저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 값을 반환함.

orElseGet()

저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 람다 표현식의 결괏값을 반환함.

orElseThrow()

저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 예외를 발생시킴.

기본 타입 Optinal클래스

IntStream 클래스와 같이 기본 타입 스트림을 위한 별도의 Optional클래스를 제공함.

OptionalInt OptionalLong OptionalDouble

Optiopnal타입이 아니라 해당 기본 타입이라는 사실만 제외하면 비슷함.

Example

// 안 좋음
Optional<Member> member = ...;
if (member.isPresent()) {
    return member.get();
} else {
    return null;
}

// 좋음
Optional<Member> member = ...;
return member.orElse(null);

// 안 좋음
Optional<Member> member = ...;
if (member.isPresent()) {
    return member.get();
} else {
    throw new NoSuchElementException();
}

// 좋음
Optional<Member> member = ...;
return member.orElseThrow(() -> new NoSuchElementException());

주의사항

  • isPresent()-get() 대신 orElse()/orElseGet()/orElseThrow()

  • orElse(new …) 대신 orElseGet(()-> new …)

  • 단지 값을 얻을 목적이라면 Optional 대신 null 비교

  • Optional 대신 비어있는 컬렉션 반환

  • Optional을 필드로 사용금지

  • Optional을 생성자나 메서드 인자로 사용 금지

  • Optional을 컬렉션의 원소로 사용 금지

  • of(), ofNullable() 혼동 주의

  • Optional 대신 OptionalInt, OptionalLong, OptionalDouble

참고 문서

  • Optional http://homoefficio.github.io/2019/10/03/Java-Optional-%EB%B0%94%EB%A5%B4%EA%B2%8C-%EC%93%B0%EA%B8%B0/ http://tcpschool.com/java/java_stream_optional