πŸͺ˜

item 27 - 비검사 κ²½κ³ λ₯Ό μ œκ±°ν•˜λΌ

속성
5μž₯

Item27 - 비검사 κ²½κ³ λ₯Ό μ œκ±°ν•˜λΌ

비검사 κ²½κ³ λž€? (unchecked)

  • λΉ„κ²€μ‚¬λŠ” μžλ°” μ»΄νŒŒμΌλŸ¬κ°€ type-safeλ₯Ό 보μž₯ν•˜κΈ° μœ„ν•΄μ„œ ν•„μš”ν•œ νƒ€μž…μ •λ³΄κ°€ μΆ©λΆ„νžˆ μ‘΄μž¬ν•˜μ§€ μ•Šλ‹€λŠ” 것을 λœ»ν•œλ‹€.
  • 기본적으둜 μžλ°” μ»΄νŒŒμΌλŸ¬λŠ” 비검사 κ²½κ³ λ₯Ό ν™œμ„±ν™”ν•˜μ§€ μ•ŠμœΌλ©° 이λ₯Ό μœ„ν•΄μ„œλŠ” μ»΄νŒŒμΌλŸ¬μ— -Xlint:uncheck μ˜΅μ…˜μ„ μ£Όμ–΄μ•Όν•œλ‹€.
public class Item27 { public static void main(String[] args) { Set<String> set_1 = new HashSet(); Set<String> set_2 = new HashSet<>(); // μžλ°” 7λΆ€ν„° 닀이아λͺ¬λ“œ μ—°μ‚°μžλ‘œ ν•΄κ²°κ°€λŠ₯ }}
notion image
  • μΈμŠ€ν„΄μŠ€λ‘œ μƒμ„±ν•œ HashSet을 Raw νƒ€μž…μœΌλ‘œ μ‚¬μš©ν•˜κ³  있기 λ•Œλ¬Έμ— λ‚˜νƒ€λ‚˜λŠ” 비검사 경고이닀.
    • 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ” μžλ°”7λΆ€ν„° μ§€μ›ν•˜λŠ” 닀이아λͺ¬λ“œ μ—°μ‚°μž<>λ₯Ό 톡해 ν•΄κ²°ν•  수 μžˆλ‹€.

μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜κ²Œ λ˜λ©΄μ„œ λ§Œλ‚˜κ²Œ λ˜λŠ” 컴파일러 κ²½κ³ 

  • 비검사 λ³€ν™˜ κ²½κ³ 
    • μ•„λž˜μ˜ μ˜ˆμ‹œλ₯Ό 보면 λ°˜ν™˜νƒ€μž…μ΄ Raw νƒ€μž…μœΌλ‘œ λ˜μ–΄μžˆλ‹€. λ”°λΌμ„œ ν˜ΈμΆœν•˜λŠ” κ³³μ—μ„œλŠ” μ•„λž˜μ™€ 같은 κ²½κ³ λ₯Ό 확인할 수 μžˆλ‹€.
    • public class Item27 { public static void main(String[] args) { List<String> elements = getElements(); } private static List getElements() { return new ArrayList<String>(); } }
      notion image
  • 비검사 ν˜•λ³€ν™˜ κ²½κ³ 
    • 비검사 λ³€ν™˜ κ²½κ³ μ—μ„œ λ°œμƒν•œ 문제λ₯Ό κ°•μ œλ‘œ ν˜•λ³€ν™˜μ„ 톡해 해결해보렀 ν•œλ‹€λ©΄ μ•„λž˜μ™€ 같은 κ²½κ³ λ₯Ό 확인할 수 μžˆλ‹€.
    • 이 κ²½μš°μ—λŠ” μžλ°” μ»΄νŒŒμΌλŸ¬κ°€ List의 μ œλ„€λ¦­ νƒ€μž…μ„ String으둜 μ •ν•  수 μžˆλŠ” 방법이 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.
      • type erasureλ•Œλ¬ΈμΈ 것 κ°™λ‹€. μ œλ„€λ¦­μ€ νƒ€μž… 정보가 μ†Œκ±°κ°€ 되기 λ•Œλ¬Έμ— μ•Œ 수 μ—†μ–΄μ„œ λ‚˜νƒ€λ‚˜λŠ” 경고인 것 κ°™λ‹€.
      • public class Item27 { public static void main(String[] args) { List<String> elements = (List<String>) getElements(); } private static List getElements() { return new ArrayList<String>(); } }
        notion image
  • 비검사 λ©”μ„œλ“œ 호좜 κ²½κ³ 
    • 이 κ²½μš°μ—λŠ” Raw νƒ€μž…μœΌλ‘œ 선언이 λ˜μ–΄ μžˆκΈ°λ•Œλ¬Έμ— μ–΄λ–€ νƒ€μž…μ˜ 값이 듀어가도 컴파일 μ‹œμ μ— μž‘μ„ 수 μ—†κ²Œλœλ‹€.
    • 그리고 μ•„λž˜μ™€ 같은 κ²½κ³ λ₯Ό 확인할 수 μžˆλ‹€. 이런 ν˜•μ‹μ„ μ§€μ›ν•˜λŠ” μ΄μœ λŠ” μ œλ„€λ¦­μ΄ λ‚˜μ˜€κΈ° μ „μ˜ μžλ°” λ²„μ „μ—μ„œλŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” κ°œλ…μ΄μ˜€κΈ°μ— ν˜Έν™˜μ„±μ„ μœ„ν•΄ ν—ˆμš©ν•˜κ³  μžˆλŠ” 것 뿐이지 이런 λ°©μ‹μœΌλ‘œ μ‚¬μš©ν•΄μ„œλŠ” μ•ˆλœλ‹€.
      • public class Item27 { public static void main(String[] args) { List names = new ArrayList(); names.add("κΉ€ν˜•μš±"); names.add(27); System.out.println(names.contains("κΉ€ν˜•μš±")); System.out.println(names.contains(27)); } }
        notion image
  • 비검사 λ§€κ°œλ³€μˆ˜ν™” κ°€λ³€μΈμˆ˜ νƒ€μž… κ²½κ³ 
    • κ°€λ³€μΈμˆ˜λ₯Ό μ œλ„€λ¦­κ³Ό ν•¨κ»˜ μ‚¬μš©ν•˜λ©΄ λ¬Έμ œκ°€ 될 수 μžˆλ‹€.
      • κ·Έ 이유둜 κ°€λ³€μΈμˆ˜λŠ” μ•”λ¬΅μ μœΌλ‘œ 배열을 μƒμ„±ν•˜λŠ”λ° μ œλ„€λ¦­μ€ 배열을 ν—ˆμš©ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€. μ΄λŸ¬ν•œ 뢈일치둜 μΈν•΄μ„œ λ‚˜νƒ€λ‚˜λŠ” κ²½κ³ λ‹€.
      • heap pollution?
        • μ œλ„€λ¦­ νƒ€μž…μ—μ„œ λ³€μˆ˜ν™”λœ νƒ€μž…μ΄ μ‹€μ œ λ‹€λ₯Έ 것을 μ˜λ―Έν•œλ‹€.
        • public class Item27 { public static void main(String[] args) { List list = toList("1", 2, "3"); Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String next = iterator.next(); System.out.println(next); } } private static <T> List<T> toList(T... elements) { return Arrays.asList(elements); } }
          notion image

ν•  수 μžˆλŠ” ν•œ λͺ¨λ“  비검사 κ²½κ³ λ₯Ό μ œκ±°ν•˜λΌ

  • μœ„μ˜ μ˜ˆμ‹œ 외에도 μ–΄λ €μš΄ 경고도 많이 μ‘΄μž¬ν•˜μ§€λ§Œ, κ³§λ°”λ‘œ ν•΄κ²°λ˜μ§€ μ•ŠλŠ” κ²½κ³ κ°€ λ‚˜νƒ€λ‚˜λ„ λͺ¨λ“  비검사 κ²½κ³ λ₯Ό μ œκ±°ν•΄μ•Ό ν•œλ‹€.
  • λͺ¨λ‘ μ œκ±°ν•œλ‹€λ©΄ κ·Έ μ½”λ“œλŠ” νƒ€μž… μ•ˆμ •μ„±μ΄ 보μž₯λœλ‹€. 즉 λŸ°νƒ€μž…μ— ClassCastException이 λ°œμƒν•  일이 μ—†μœΌλ©° μ˜λ„ν•œ λŒ€λ‘œ 잘 λ™μž‘ν•  것이닀.
  • κ²½κ³ λ₯Ό μ œκ±°ν•  수 μ—†μ§€λ§Œ νƒ€μž… μ•ˆμ „μ„±μ„ ν™•μ‹ ν•  수 μžˆλ‹€λ©΄ @SuppressWarnings(β€œunchecked”) μ• λ„ˆν…Œμ΄μ…˜μ„ 달아 κ²½κ³ λ₯Ό μˆ¨κΈ°λ„λ‘ν•˜μž.
  • @SuppressWarnings μ• λ„ˆν…Œμ΄μ…˜μ€ κ°œλ³„ μ§€μ—­λ²ˆμˆ˜ μ„ μ–ΈλΆ€ν„° 클래슀 μ „μ²΄κΉŒμ§€ μ–΄λ–€ 선언에도 달 수 μžˆμ§€λ§Œ κ°€λŠ₯ν•œ 쒁은 λ²”μœ„μ— μ μš©ν•˜λ„λ‘ ν•˜μž.
    • 보톡 λ³€μˆ˜μ„ μ–Έ, μ•„μ£Ό 짧은 λ©”μ„œλ“œ, μƒμ„±μžκ°€ 될 것이닀.
    • μ‹¬κ°ν•œ κ²½κ³ λ₯Ό 놓칠 수 있기 λ•Œλ¬Έμ— μ ˆλŒ€ 클래슀 전체에 μ μš©ν•΄μ„œλŠ” μ•ˆλœλ‹€.
    • μ• λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•  λ•Œ 이 κ²½κ³ λ₯Ό λ¬΄μ‹œν•΄λ„ λ˜λŠ” 이유λ₯Ό μ£Όμ„μœΌλ‘œ 남겨야 λ‹€λ₯Έ μ‚¬λžŒμ΄ κ·Έ μ½”λ“œλ₯Ό 이해할 수 있으며 잘λͺ» μˆ˜μ •ν•˜λŠ” 상황을 λ°©μ§€ν•œλ‹€.

SuppressWarnings μ‚¬μš©λ°©λ²•

  • μ½”λ“œκ°€ μ•ˆμ „μ„±μ΄ 보μž₯될 λ•Œ μ‚¬μš©ν•΄μ•Όν•œλ‹€.
@SuppressWarnings("unchecked") private static <T> List<T> toList(T... elements) { return Arrays.asList(elements); }