λ¬Έμ μ½λ:
private final List<Cheese> cheesesInStock = new ArrayList<>();
public List<Cheese> getCheeses() {
return cheesesInStock.isEmpty() ? null : new ArrayList<>(cheesesInStock);
}- μ λ©μλλ
cheesesInStockμ μμκ° μμ λ nullμ λ°ννλ€. - μ΄λ‘ μΈν΄ λ©μλλ₯Ό νΈμΆνλ ν΄λΌμ΄μΈνΈ μ½λμμ null 체ν¬λ₯Ό νμμ μΌλ‘ ν΄μΌ νλ€. λ°©μ΄μ½λ νμ!
λ¬Έμ νμΈ:
@Test
public void getCheesesClient() {
List<Cheese> cheeses = getCheeses();
if (cheeses != null && cheeses.contains(Cheese.STILTON)) {
System.out.println("μ’μμ΄, λ°λ‘ κ·Έκ±°μΌ.");
}
}getCheeses()λ©μλλ₯Ό μ¬μ©νλ ν΄λΌμ΄μΈνΈλ λ°λμcheeses != nullκ³Ό κ°μ 쑰건문μ μ¬μ©ν΄ nullμ μ²λ¦¬ν΄μΌ νλ€.- μ΄λ¬ν null μ²λ¦¬λ μ½λλ₯Ό 볡μ‘νκ² νκ³ NullPointerException(NPE)μ μ λ°ν κ°λ₯μ±μ λμΈλ€.
- nullμ λ°ννμ§ μλ λμ
λΉ λ¦¬μ€νΈλ₯Ό λ°ννλ©΄ ν΄λΌμ΄μΈνΈ μ½λμμ μΆκ°μ μΈ null μ²λ¦¬λ₯Ό νμ§ μμλ λλ©°, μ½λκ° κ°λ¨ν΄μ§κ³ μμ ν΄μ§λ€.
{% hint style="danger" %} nullμ λ°ννλ κ²μ΄ μ±λ₯μ λ«μ§ μμκ°?: {% endhint %}
- μ± μμλ μ΄ λ¬Όμμ΄ νλ Έλ€κ³ λ΅νλ€.
- λ¬Όλ‘ μλ‘μ΄ κ°μ²΄λ₯Ό νλ λ§λ€μ§λ§ μ¬μ€μ μ±λ₯μμ 컀λ€λ μν΄κ° μλ€. (λ―Έλ―Ένλ€.)
- λΉ μ»¬λ μ
κ³Ό λ°°μ΄μ κ΅³μ΄ μλ‘ ν λΉνμ§ μκ³ λ λ°ν κ°λ₯νλ€.
- λΉ μ»¬λ μ μ λΆλ³μΌλ‘ μ μΈν΄λκ³ κ°μ μΌμ΄μ€μ κ³μ μ¬νμ©ν΄μ ν λΉν΄λ λλ€.
- Collections.emptyList(), Collections.emptySet(), Collections.emptyMap()λ μλ€.
public List<Cheese> getCheeses2() {
return new ArrayList<>(cheesesInStock);
}- μ΄ λ°©λ²μ μλ‘μ΄ λ¦¬μ€νΈλ₯Ό λ§λ€μ΄ λ°νν©
- μ¬μ© ν¨ν΄μ λ°λΌ μ±λ₯μ μν₯μ μ€ μ μμ§λ§, λλΆλΆμ κ²½μ° ν° λ¬Έμ κ° λμ§ μλλ€.
public Cheese[] getCheeses3() {
return cheesesInStock.toArray(new Cheese[0]);
}- λ°°μ΄μ λ°νν λλ null λμ κΈΈμ΄ 0μ§λ¦¬ λ°°μ΄μ λ°ννλ κ²μ΄ λ μ’λ€.
private static final Cheese[] EMPTY_CHEESE_ARRAY = new Cheese[0];
public Cheese[] getCheeses4() {
return cheesesInStock.toArray(EMPTY_CHEESE_ARRAY);
}EMPTY_CHEESE_ARRAYλ₯Ό μ¬μ©ν΄ μ¬μ¬μ© κ°λ₯ν λΉ λ°°μ΄μ λ°ννλ€.- μ±λ₯μ λ°°μ΄μ λ§€λ² μμ±νμ§ μκΈ° λλ¬Έμ ν¨μ¨μ
- toArray()μ λμ λ°©μ:
toArray()λ λ§€κ°λ³μλ‘ λ°μ λ°°μ΄μ ν¬κΈ°μ λ°λΌ λμμ΄ λ¬λΌμ§λ€.- λ°°μ΄μ΄ μΆ©λΆν ν¬λ©΄ μμλ₯Ό λ΄μ λ°ννλ€.
- κ·Έλ μ§ μμΌλ©΄ λ°°μ΄μ μλ‘ μμ±νμ¬ κ·Έ μμ μμλ₯Ό λ΄μ λ°ννλ€.
- κΈΈμ΄ 0μ§λ¦¬ λ°°μ΄μ λ§€κ°λ³μλ‘ μ¬μ©νλ©΄, JVMμ΄ λ ν¨μ¨μ μΌλ‘ μ λ°°μ΄μ μμ±ν΄μ£Όλ μ΅μ νκ° μ΄λ£¨μ΄μ§ μ μλ€.
- null λ°νμ νΌνκ³ λΉ μ»¬λ μ
μ΄λ λ°°μ΄μ λ°ννμ:
- λ°°μ΄μ΄λ 컬λ μ μ λ°νν λλ null λμ λΉ μ»¬λ μ μ΄λ λ°°μ΄μ λ°ννλ κ²μ΄ μ’λ€.
- μ΄λ₯Ό ν΅ν΄ API μ¬μ©μμκ² μΆκ°μ μΈ null μ²΄ν¬ λΆλ΄μ μ€μ¬μ€ μ μμΌλ©°, μ½λμ μμ μ±μ λμΈλ€.
- null λ°νμ λ¨μ :
- API μ¬μ© μ κ³ λ €ν μ μ΄ λ§μμ§κ³ , nullμ μ²λ¦¬νμ§ μμΌλ©΄ NPEκ° λ°μν μ μλ μνμ΄ ν¬λ€.
- μ΄λ¬ν λΆνμν null μ²λ¦¬λ μ½λμ κ°λ μ±μ λ¨μ΄λ¨λ¦¬κ³ μ€λ₯λ₯Ό μ λ°ν κ°λ₯μ±μ΄ λμμ§λ€.
- μ±λ₯ μ΅μ ν:
- λΉ μ»¬λ μ μ΄λ λ°°μ΄μ λ°ννλ κ²μ΄ μ±λ₯ λ©΄μμ ν° μ°¨μ΄κ° μμΌλ©°, λλ‘λ μ¬μ¬μ© κ°λ₯ν λΆλ³ κ°μ²΄λ₯Ό νμ©ν΄ μ΅μ νν μλ μλ€.
- μλ₯Ό λ€μ΄
Collections.emptyList(),Collections.emptySet(),Collections.emptyMap()μ JVMμμ 미리 μ€λΉλ κ°μ²΄λ₯Ό μ¬μ¬μ©νλ λ°©μμΌλ‘ λ§€μ° ν¨μ¨μ
- μ½λμ μμ μ±:
- nullμ λ°ννλ λμ λΉ κ°μ²΄λ₯Ό λ°νν¨μΌλ‘μ¨ μ½λκ° λ³΄λ€ μμ νκ³ κ°κ²°ν΄μ§λ€. NPEμ κ°μ λ°νμ μμΈ λ°μμ λ°©μ§ν μ μμ΄ APIμ μ λ’°μ±μ΄ λμμ§λ€.
- μ½κΈ° μ μ© μ»¬λ μ
μ¬μ©:
- κ°λ₯νλ©΄ λΆλ³ 컬λ μ
μ λ°ννλ κ²μ΄ μ’λ€. μλ₯Ό λ€μ΄,
Collections.emptyList()λCollections.unmodifiableList()λ₯Ό μ¬μ©ν΄ λ°νλ 컬λ μ μ μμ νμ§ λͺ»νλλ‘ νλ©΄, λΆνμν μ¬μ΄λ μ΄ννΈλ₯Ό λ°©μ§ν μ μλ€.
- κ°λ₯νλ©΄ λΆλ³ 컬λ μ
μ λ°ννλ κ²μ΄ μ’λ€. μλ₯Ό λ€μ΄,
- μ±λ₯κ³Ό μ¬μ¬μ©μ±:
- λΉ μ»¬λ μ μ΄λ λ°°μ΄μ μ¬μ¬μ©ν¨μΌλ‘μ¨ μ±λ₯μ μΈ μ΄μ μ μ»μ μ μλ€. λΉ κ°μ²΄λ₯Ό λ§€λ² μλ‘ μμ±νμ§ μκ³ , 미리 μ μΈν λΉ κ°μ²΄λ₯Ό μ¬μ¬μ©νλ κ²μ΄ λ ν¨μ¨μ λ€.
- ν΄λΌμ΄μΈνΈ μ½λμ κ°κ²°μ±:
- nullμ λ°ννλ©΄ ν΄λΌμ΄μΈνΈ μ½λκ° μ΄λ₯Ό λͺ μμ μΌλ‘ 체ν¬ν΄μΌ νλ―λ‘ μ½λκ° λ³΅μ‘ν΄μ§λ€. λΉ μ»¬λ μ μ λ°ννλ©΄ μ΄λ° 체ν¬κ° νμ μμ΄μ Έ μ½λκ° κ°κ²°ν΄μ§κ³ μ μ§λ³΄μκ° μ¬μμ§λ€.
κ²°λ‘ μ μΌλ‘, nullμ λ°ννμ§ λ§κ³ λΉ μ»¬λ μ μ΄λ λ°°μ΄μ λ°ννλ κ²μ΄ μ±λ₯κ³Ό μμ μ± λ©΄μμ λ μ’λ€. null 체ν¬λ₯Ό μ΅μννκ³ , ν΄λΌμ΄μΈνΈ μ½λμ κ°κ²°ν¨κ³Ό μ μ§λ³΄μμ±μ λμ΄λ©°, μ±λ₯μμΌλ‘λ ν° μ°¨μ΄κ° μκΈ° λλ¬Έμ μ΅μ μ μ ν
μ°Έκ³ λ° μΆμ²
 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png)