Skip to content

Latest commit

Β 

History

History
120 lines (87 loc) Β· 6.01 KB

File metadata and controls

120 lines (87 loc) Β· 6.01 KB

item 54 : null이 μ•„λ‹Œ, 빈 μ»¬λ ‰μ…˜μ΄λ‚˜ 배열을 λ°˜ν™˜ν•˜λΌ

1. null을 λ°˜ν™˜ν•˜λŠ” κ²ƒμ˜ 단점

문제 μ½”λ“œ:

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()도 μžˆλ‹€.

2. null을 λ°˜ν™˜ν•˜μ§€ μ•ŠλŠ” λŒ€μ•ˆ

1) μ»¬λ ‰μ…˜ μƒμ„±μžλ₯Ό μ΄μš©ν•˜λŠ” 방법:

public List<Cheese> getCheeses2() {
    return new ArrayList<>(cheesesInStock);
}
  • 이 방법은 μƒˆλ‘œμš΄ 리슀트λ₯Ό λ§Œλ“€μ–΄ λ°˜ν™˜ν•©
  • μ‚¬μš© νŒ¨ν„΄μ— 따라 μ„±λŠ₯에 영ν–₯을 쀄 수 μžˆμ§€λ§Œ, λŒ€λΆ€λΆ„μ˜ 경우 큰 λ¬Έμ œκ°€ λ˜μ§€ μ•ŠλŠ”λ‹€.

2) 길이 0짜리 배열을 λ°˜ν™˜ν•˜λŠ” 방법:

public Cheese[] getCheeses3() {
    return cheesesInStock.toArray(new Cheese[0]);
}
  • 배열을 λ°˜ν™˜ν•  λ•Œλ„ null λŒ€μ‹  길이 0짜리 배열을 λ°˜ν™˜ν•˜λŠ” 것이 더 μ’‹λ‹€.

3) λΆˆλ³€μΈ 빈 배열을 μ‚¬μš©ν•˜λŠ” 방법:

private static final Cheese[] EMPTY_CHEESE_ARRAY = new Cheese[0];

public Cheese[] getCheeses4() {
    return cheesesInStock.toArray(EMPTY_CHEESE_ARRAY);
}
  • EMPTY_CHEESE_ARRAYλ₯Ό μ‚¬μš©ν•΄ μž¬μ‚¬μš© κ°€λŠ₯ν•œ 빈 배열을 λ°˜ν™˜ν•œλ‹€.
  • μ„±λŠ₯상 배열을 맀번 μƒμ„±ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 효율적
  1. toArray()의 λ™μž‘ 방식:
    • toArray()λŠ” λ§€κ°œλ³€μˆ˜λ‘œ 받은 λ°°μ—΄μ˜ 크기에 따라 λ™μž‘μ΄ 달라진닀.
      • 배열이 μΆ©λΆ„νžˆ 크면 μ›μ†Œλ₯Ό λ‹΄μ•„ λ°˜ν™˜ν•œλ‹€.
      • κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ 배열을 μƒˆλ‘œ μƒμ„±ν•˜μ—¬ κ·Έ μ•ˆμ— μ›μ†Œλ₯Ό λ‹΄μ•„ λ°˜ν™˜ν•œλ‹€.
    • 길이 0짜리 배열을 λ§€κ°œλ³€μˆ˜λ‘œ μ‚¬μš©ν•˜λ©΄, JVM이 더 효율적으둜 μƒˆ 배열을 μƒμ„±ν•΄μ£ΌλŠ” μ΅œμ ν™”κ°€ μ΄λ£¨μ–΄μ§ˆ 수 μžˆλ‹€.

πŸ“š 핡심 정리

  1. null λ°˜ν™˜μ„ ν”Όν•˜κ³  빈 μ»¬λ ‰μ…˜μ΄λ‚˜ 배열을 λ°˜ν™˜ν•˜μž:
    • λ°°μ—΄μ΄λ‚˜ μ»¬λ ‰μ…˜μ„ λ°˜ν™˜ν•  λ•ŒλŠ” null λŒ€μ‹  빈 μ»¬λ ‰μ…˜μ΄λ‚˜ 배열을 λ°˜ν™˜ν•˜λŠ” 것이 μ’‹λ‹€.
    • 이λ₯Ό 톡해 API μ‚¬μš©μžμ—κ²Œ 좔가적인 null 체크 뢀담을 쀄여쀄 수 있으며, μ½”λ“œμ˜ μ•ˆμ „μ„±μ„ 높인닀.
  2. null λ°˜ν™˜μ˜ 단점:
    • API μ‚¬μš© μ‹œ κ³ λ €ν•  점이 λ§Žμ•„μ§€κ³ , null을 μ²˜λ¦¬ν•˜μ§€ μ•ŠμœΌλ©΄ NPEκ°€ λ°œμƒν•  수 μžˆλŠ” μœ„ν—˜μ΄ 크닀.
    • μ΄λŸ¬ν•œ λΆˆν•„μš”ν•œ null μ²˜λ¦¬λŠ” μ½”λ“œμ˜ 가독성을 λ–¨μ–΄λœ¨λ¦¬κ³  였λ₯˜λ₯Ό μœ λ°œν•  κ°€λŠ₯성이 λ†’μ•„μ§„λ‹€.
  3. μ„±λŠ₯ μ΅œμ ν™”:
    • 빈 μ»¬λ ‰μ…˜μ΄λ‚˜ 배열을 λ°˜ν™˜ν•˜λŠ” 것이 μ„±λŠ₯ λ©΄μ—μ„œ 큰 차이가 μ—†μœΌλ©°, λ•Œλ‘œλŠ” μž¬μ‚¬μš© κ°€λŠ₯ν•œ λΆˆλ³€ 객체λ₯Ό ν™œμš©ν•΄ μ΅œμ ν™”ν•  μˆ˜λ„ μžˆλ‹€.
    • 예λ₯Ό λ“€μ–΄ Collections.emptyList(), Collections.emptySet(), Collections.emptyMap()은 JVMμ—μ„œ 미리 μ€€λΉ„λœ 객체λ₯Ό μž¬μ‚¬μš©ν•˜λŠ” λ°©μ‹μœΌλ‘œ 맀우 효율적

😲 κ³ λ €ν•΄μ•Ό ν•  점

  1. μ½”λ“œμ˜ μ•ˆμ „μ„±:
    • null을 λ°˜ν™˜ν•˜λŠ” λŒ€μ‹  빈 객체λ₯Ό λ°˜ν™˜ν•¨μœΌλ‘œμ¨ μ½”λ“œκ°€ 보닀 μ•ˆμ „ν•˜κ³  κ°„κ²°ν•΄μ§„λ‹€. NPE와 같은 λŸ°νƒ€μž„ μ˜ˆμ™Έ λ°œμƒμ„ λ°©μ§€ν•  수 μžˆμ–΄ API의 신뒰성이 λ†’μ•„μ§„λ‹€.
  2. 읽기 μ „μš© μ»¬λ ‰μ…˜ μ‚¬μš©:
    • κ°€λŠ₯ν•˜λ©΄ λΆˆλ³€ μ»¬λ ‰μ…˜μ„ λ°˜ν™˜ν•˜λŠ” 것이 μ’‹λ‹€. 예λ₯Ό λ“€μ–΄, Collections.emptyList()λ‚˜ Collections.unmodifiableList()λ₯Ό μ‚¬μš©ν•΄ λ°˜ν™˜λœ μ»¬λ ‰μ…˜μ„ μˆ˜μ •ν•˜μ§€ λͺ»ν•˜λ„둝 ν•˜λ©΄, λΆˆν•„μš”ν•œ μ‚¬μ΄λ“œ μ΄νŽ™νŠΈλ₯Ό λ°©μ§€ν•  수 μžˆλ‹€.
  3. μ„±λŠ₯κ³Ό μž¬μ‚¬μš©μ„±:
    • 빈 μ»¬λ ‰μ…˜μ΄λ‚˜ 배열을 μž¬μ‚¬μš©ν•¨μœΌλ‘œμ¨ μ„±λŠ₯적인 이점을 얻을 수 μžˆλ‹€. 빈 객체λ₯Ό 맀번 μƒˆλ‘œ μƒμ„±ν•˜μ§€ μ•Šκ³ , 미리 μ„ μ–Έν•œ 빈 객체λ₯Ό μž¬μ‚¬μš©ν•˜λŠ” 것이 더 νš¨μœ¨μ λ‹€.
  4. ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œμ˜ κ°„κ²°μ„±:
    • null을 λ°˜ν™˜ν•˜λ©΄ ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œκ°€ 이λ₯Ό λͺ…μ‹œμ μœΌλ‘œ 체크해야 ν•˜λ―€λ‘œ μ½”λ“œκ°€ λ³΅μž‘ν•΄μ§„λ‹€. 빈 μ»¬λ ‰μ…˜μ„ λ°˜ν™˜ν•˜λ©΄ 이런 체크가 ν•„μš” μ—†μ–΄μ Έ μ½”λ“œκ°€ κ°„κ²°ν•΄μ§€κ³  μœ μ§€λ³΄μˆ˜κ°€ μ‰¬μ›Œμ§„λ‹€.

결둠적으둜, null을 λ°˜ν™˜ν•˜μ§€ 말고 빈 μ»¬λ ‰μ…˜μ΄λ‚˜ 배열을 λ°˜ν™˜ν•˜λŠ” 것이 μ„±λŠ₯κ³Ό μ•ˆμ „μ„± λ©΄μ—μ„œ 더 μ’‹λ‹€. null 체크λ₯Ό μ΅œμ†Œν™”ν•˜κ³ , ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œμ˜ 간결함과 μœ μ§€λ³΄μˆ˜μ„±μ„ 높이며, μ„±λŠ₯μƒμœΌλ‘œλ„ 큰 차이가 μ—†κΈ° λ•Œλ¬Έμ— μ΅œμ„ μ˜ 선택

참고 및 좜처