λͺ©μ°¨
- μλ° Optional: 1. nullμ 무μμΈκ°?
- μλ° Optional: 2. Optional μκ°
- μλ° Optional: 3. Optional μ€κ° μ²λ¦¬ λ©μλ
- μλ° Optional: 4. Optional μ’ λ¨ μ²λ¦¬ λ©μλ
- μλ° Optional: 5. Optional νΊμ보기
nullμ΄ μ£Όλ λ¬Έμ
μμ κΈμμλ μλ° μΈμ΄μμ nullμ νΉμ§κ³Ό ν¨κ» μλͺ»λ null μ°Έμ‘°λ‘ μΈν΄ λ°μνλ λ¬Έμ λ€μ λν΄μ μμ보μλ€.
λ΄μ©μ μ 리ν΄λ³΄λ©΄, λ°νμμμ nullμ μλͺ» μ°Έμ‘°νλ κ²½μ°μλ NullPointerExceptionμ΄ λ°μνμ¬ λ¬Έμ κ° λ°μν μ μκ³
μ΄λ₯Ό νΌνκ³ μ μ겨λλ μ²΄ν¬ λ‘μ§μΌλ‘ μΈν΄ μ½λκ° λ³΅μ‘ν΄μ§λ λ¬Έμ κ° μλ€.
μ¬μ€ null μ²λ¦¬λ₯Ό κ°μ νλ €λ λ
Έλ ₯μ Optional ν΄λμ€ μ΄μ μλ μμλ€. μλ°7 μ βProject Coinβμμλ
μμ νΈμΆ(safe call)μ μν μλΉμ€ μ°μ°μ(elvis operator)κ° μ μλμμΌλ κ²°κ³Όμ μΌλ‘λ μΉμΈλμ§ μμλ€.
μλΉμ€ μ°μ°μλ λ³΄ν΅ ?:μ λ§νλ€. μκ³λ°©ν₯μΌλ‘ 90λ νμ νλ©΄ μλΉμ€ νλ μ¬λ¦¬(Elvis Presley) μ λͺ¨μ΅μ΄ μ°μλλ€.
μλ‘μ΄ μμ μ₯μΉλ₯Ό μ μ©νλ μ΄μ μ΄ λμ
νλ λΉμ©λ³΄λ€ μ’μ§ μμκΈ° λλ¬Έμ΄κ² μ§λ§, μ μμ΄ μΉμΈλμλ€λ©΄
μ°λ¦¬λ μλ°μμ nullμ΄ μ£Όλ λ¬Έμ λ€μ μλμ κ°μ μ½λλ‘ ννΌνμμ§λ λͺ¨λ₯Έλ€.
// νΉμλ μ΄λ° μ½λκ° κ°λ₯νμ§ μμμκΉ?
public String getPhoneManufacturerName(Person person) {
// 체μ΄λ μ€μμ nullμ΄ μλ€λ©΄, "Samsung"μ λ°ννλ€.
return person?.getPhone()?.getManufacturer()?.getName() : "Samsung";
}
κ·Έλ λ€λ©΄, λ³΄λ€ λμ null μ²λ¦¬λ₯Ό μν΄ νμν Optional ν΄λμ€λ 무μμΌκΉ?
Optional ν΄λμ€
java.util.Optional<T> ν΄λμ€λ ν¨μν(Functional) μΈμ΄μΈ μ€μΉΌλΌ(Scala)μ νμ€μΌ(Haskell)μ μν₯μ λ°μμ νμνλ€.
μλ§ μ€μΉΌλΌμ Optionalκ³Ό νμ€μΌμ Maybeμ μν₯μ΄ μλκΉ μΆμ§λ§, μλ°μ Optionalμ λͺ©μ μ λ°νλλ κ°μ΄ βμμβμ
λνλ΄λ κ²μ΄λ€. μ΄λ ν΄λμ€μ λ¬λ¦° μ£Όμμ ν΅ν΄μλ μ μ μλλ°, API Note λΆλΆμ μλμ κ°μ΄ κ°λ°μμ μλκ° λͺ
μλΌμλ€.
Optional is primarily intended for use as a method return type where there is a clear need to represent βno result,β and where using null is likely to cause errors. A variable whose type is Optional should never itself be null; it should always point to an Optional instance.
μ΅μ λμ μ£Όλ‘ βκ²°κ³Ό μμβμ λνλΌ νμκ° λΆλͺ νκ³
nullμ μ¬μ©νλ©΄ μ€λ₯κ° λ°μν κ°λ₯μ±μ΄ μλ λ©μλ λ¦¬ν΄ νμ μΌλ‘ μ¬μ©νκΈ° μν κ²μ΄λ€. μ΅μ λ νμ μ λ³μλ κ·Έ μ체κ°nullμ΄λ©΄ μ λλ©° νμ Optional μΈμ€ν΄μ€λ₯Ό κ°λ¦¬μΌμΌ νλ€.
Optionalμ λΉλμ΄ λ§νλ©΄ μ 리κ°μ΄ νμλκΈ° μ¬μ΄ κ²μ ν¬μ₯ν λ κ°μΈλ μμ΄μΊ‘(μΌλͺ
λ½λ½μ΄)κ³Ό κ°λ€. μ½κ² κΉ¨μ Έλ²λ¦¬λ
μ 리μ²λΌ, μλͺ» λ€λ£¨λ©΄ μ¬κ°ν μ€λ₯λ₯Ό μΌμΌν¬ μ μλ nullμ μμ νκ² λ€λ£° μ μκ² ν΄μ€λ€.
κ·ΈλΌ μ΄μ λΆν° Optionalμ μ¬μ©νλ λ°©λ²μ λν΄μ νλμ© μμ보μ.
Optional κ°μ²΄ μ μΈ
Optional ν΄λμ€μ λͺ
μΈλ₯Ό 보면 μ μ μλ―μ΄, μ λ€λ¦ νμ
μΌλ‘ μ 곡λλ€.
λ°λΌμ μ μΈκ³Ό λμμ νμ
λ§€κ°λ³μλ₯Ό μ§μ νλ€. μ¦, Optionalμ΄ κ°μΈλ κ°μ²΄μ νμ
μ μ§μ νλ€.
Optional<Person> person; // Person νμ
μ `Optional` λ³μ
Optional<Phone> phone; // phone νμ
μ `Optional` λ³μ
Optional κ°μ²΄ μμ±
Optional κ°μ²΄λ₯Ό λ§λ€κΈ° μν μ μ ν©ν°λ¦¬ λ©μλ(static factory method)κ° μ 곡λλ€.
Optional.empty()
λΉμ΄μλ Optional κ°μ²΄λ₯Ό μμ±νλ€. λ΄λΆμ μΌλ‘λ Optional ν΄λμ€κ° κ°μ§ μ±κΈν΄ μΈμ€ν΄μ€λ₯Ό λ°ννκ² λλ€.
βλΉμ΄μλ€β λΌλ μλ―Έμμ nullκ³Ό λΉμ·νμ§λ§, Optional.empty()λ μ°Έμ‘°νλλΌλ NullPointerExceptionκ³Ό κ°μ μμΈκ°
λ°μνμ§ μλ μ μ΄ λ€λ₯΄λ€.
// `Optional` ν΄λμ€μ μ μ λ©€λ²λ‘ μ μΈλμ΄ μμ
private static final Optional<?> EMPTY = new Optional<>();
public static<T> Optional<T> empty() {
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
Optional.of(T value)
nullμ΄ μλ κ°μ κ°μΈλ Optional κ°μ²΄λ₯Ό μμ±νλ€. μ¬κΈ°μ κ°μ΄ nullμΈ κ²½μ° NullPointerExceptionμ΄ λ°μνλ€.
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}
Optional.ofNullable(T value)
null κ°μ μ μ₯ν μ μλ Optional κ°μ²΄λ₯Ό μμ±νλ€. κ°μ΄ nullμΈ κ²½μ° λΉ Optional κ°μ²΄λ₯Ό λ°ννλ€.
λ°λΌμ μΈμλ‘ λ겨μ§λ κ°μ΄ nullμΌμ§λ λͺ¨λ₯΄λ μν©μμ μ¬μ©νλ©΄ λλ€.
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
κ°μ²΄λ μμ±νλλ°, μ΄λ»κ² μ¬μ©νμ§?
μ΄λ²κΈμμλ Optional ν΄λμ€μ λν μκ°μ Optional κ°μ²΄λ₯Ό μμ±νλ λ°©λ²μ λν΄μ μμ보μλ€.
μ΄μ΄μ§λ κΈμμλ Optional κ°μ²΄μ κ°μ νν°λ§ νκ±°λ λ€λ₯Έ ννλ‘ λ³νμν€λ λ°©λ²μ λν΄μ μκ°νλ€.