π± μ΅μ λ(Optional)μ΄λ? + μ μ¬μ©ν΄μΌ νλμ§?
μλ° 8μ μΆκ°λ κΈ°λ₯μ΄λ©°, κ²°κ΄κ°μ΄ μμ(null)μ λ μμ νκ³ λͺ νν μ λ¬νκΈ° μν΄ λ±μ₯νλ€.
μλ° 8 μ΄μ κΉμ§ nullλ‘ νννμ§λ§ μλ€μνΌ nullμ μμ€ν μ μ€λ₯λ₯Ό λ°μμν¬ κ°λ₯μ±μ΄ λ§€μ° λλ€
μ¦ μμ€ν μ NPE(NullPointerException)λ‘λΆν° μμ νκ² λ³΄νΈνκΈ° μν κΈ°λ₯μ μ 곡νλ λνΌ(Wrapper) ν΄λμ€μ΄λ€.
Null safetyλ₯Ό κ³ λ €νλ κ°λ°μ ν΅ν΄ μλ¬λ₯Ό λ°©μ§νκ³ μμ€ν μ μμ μ±μ 보μ₯νκΈ° μν΄ μ΅μ λμ μ¬μ©νλ€.
π¨ μ¬μ© μ μ£Όμμ¬ν
κ·Έλ λ€λ©΄ λͺ¨λ λ³μ, λ°νκ°μ μ΅μ λλ‘ λν ν΄μ κ΄λ¦¬νλ©΄ λλ κ² μλκ°?
μμ μ΄μΌκΈ°νλ κ²μ²λΌ μ΅μ λμ λνΌ(Wrapper) ν΄λμ€μ΄λ€. λ°νκ° λ±μ κ°μΈκ³ (Wrapping), λ€μ κΊΌλ΄λ(Unwrapping)
μ μ°¨λ₯Ό κ°μ§λ€.
κ·Έλ λ€λ©΄ λ°νκ°μ΄ nullμ΄ μλλΌλ νμ μ΄ μλ κ²½μ°, μ΅μ λμ λν, μΈλνμ΄ μλ―Έκ° μμκΉ?
λΉμ°ν μμλΏλλ¬, μΆκ°μ μΈ μ€λ²ν€λλ₯Ό λ°μν΄ μ±λ₯μ λΆμ΄μ΅μ΄ μκΈΈ μ μλ€.
μ¦ λ°νκ°μ΄ NullμΈ κ°λ₯μ±μ΄ μλ κ³³λ§ λΆλΆμ μΌλ‘ μ΅μ λμ μ¬μ©νλ κ² μ μ νλ€.
π οΈ μ΅μ λμ λ©μλ
- isPresent()
Optional<String> optName1 = Optional.of("NewJeans"); // null X
Optional<String> optName2 = Optional.empty(); // null
System.out.println(optName1.isPresent()); // true
System.out.println(optName2.isPresent()); // false
isPresent() -> boolean νμ μ λ°ννλ€, nullμ΄λΌλ©΄ false, μλλΌλ©΄ trueλ₯Ό κ°κ° λ°ννλ€
isPresnt()κ° μμλ€λ©΄ 쑰건문μΌλ‘ λΆκΈ°μ²λ¦¬λ₯Ό ν΅ν΄ null μ κ±°νμ κ²μ΄λ€. μ½λκ° ν¨μ¬ κ°κ²°νκ³ κ°λ μ±λ μ’μ 보μΈλ€.
- empty()
Optional<String> optName1 = Optional.of(null);
Optional<String> optName2 = Optional.empty(); // κΆμ₯
λ μ½λλ€ optNameNμ nullμ ν λΉνλ€, νμ§λ§ μλ μ½λ Optional.empty()λ₯Ό μ¬μ©νλ κ²μ κΆμ₯νλ€
μ΅μ λ λ³μμ nullμ ν λΉνλ©΄ λ³μ μμ²΄κ° nullμΈμ§ λ€μ νμΈν΄μΌ νλ€. μ΄λ λΉν¨μ¨μ μ΄λ©° empty()λ₯Ό μ¬μ©νλ κ²μ κΆμ₯νλ€.
- ofNullable(), of()
Optional<String> optName1 = Optional.ofNullable(null); // null μ΄μ¬λ NPE λ°©μ§
Optional<String> optName2 = Optional.of(null); // NPE λ°μ
Optional.of() λ©μλλ null ν λΉ μ NPEλ‘λΆν° 보νΈνμ§ λͺ»νμ§λ§,
Optional.ofNullable() λ©μλλ null ν λΉ μ null -> Optional.emptyλ‘ λ΄λΆμ μΈ λ¨κ³μμ λ³ννμ¬
NPEλ₯Ό λ°©μ§νλ€. ofNullable()μ μ¬μ©νλ κ²μ κΆμ₯νλ€κ³ νλ€.
- get(), orElse()
Optional<String> optName1 = Optional.ofNullable(null);
// null -> λ μ
λλ€^^ μΆλ ₯, μλλΌλ©΄ -> μ μ μΆλ ₯
System.out.println(optName1.orElse("λ μ
λλ€^^"));
μ΅μ λλ‘ κ°μΈμ§ nullμ. get() μ΄μ©νμ¬ λ°λ‘ κΊΌλ΄λ κ²μ NullPointerμλ¬κ° μλ NoSuchElementμλ¬κ° λ°μνλ€.
λΉμ°νκ²λ optName1μλ Optional.emptyκ° λ΄κ²¨ μκΈ° λλ¬Έμ΄λ€.
orElse, orElseGet, orElseThrows κ³μ΄μ λ©μλλ₯Ό μ¬μ©ν΄μ nullμ λν μμΈμ²λ¦¬λ₯Ό ν΄μ€λ€
. get()μ λ λ€λ₯Έ μ€λ₯λ₯Ό λ°μμν¬ μ μκΈ° λλ¬Έμ orElse~~() λ©μλκ° κΆμ₯μ¬νμ΄λ€.
λλ§μ κ°λ° λ°μ΄ν°λ² μ΄μ€!
ν¬μ€ν μ΄ μ’μλ€λ©΄ "μ’μμβ€οΈ" λλ "ꡬλ ππ»" ν΄μ£ΌμΈμ!