Java/Java의 정석

Chapter 12 - μ œλ„€λ¦­μŠ€, μ—΄κ±°ν˜•, μ• λ„ˆν…Œμ΄μ…˜

vividswan 2022. 5. 9. 20:14

Chapter 12 - μ œλ„€λ¦­μŠ€, μ—΄κ±°ν˜•, μ• λ„ˆν…Œμ΄μ…˜

1. μ§€λ„€λ¦­μŠ€(Generics)

  • JDK 1.5μ—μ„œ 처음 λ„μž…

1.1 μ§€λ„€λ¦­μŠ€λž€?

  • λ‹€μ–‘ν•œ νƒ€μž…μ˜ 객체듀을 λ‹€λ£¨λŠ” λ©”μ„œλ“œλ‚˜ μ»¬λ ‰μ…˜ ν΄λž˜μŠ€μ— 컴파일 μ‹œμ˜ νƒ€μž… 체크λ₯Ό ν•΄μ£ΌλŠ” κΈ°λŠ₯
    • νƒ€μž… μ•ˆμ •μ„±μ„ 높이고 ν˜•λ³€ν™˜μ˜ λ²ˆκ±°λ‘œμ›€ κ°μ†Œ

1.2 지넀릭 클래슀의 μ„ μ–Έ

  • 클래슀 μ˜†μ— <T>λ₯Ό 뢙이고 Object 클래슀λ₯Ό λͺ¨λ‘ T둜 λ³€κ²½
    • TλŠ” νƒ€μž… λ³€μˆ˜λΌκ³  뢀름 (Tκ°€ μ•„λ‹Œ λ‹€λ₯Έ 것 μ‚¬μš©ν•΄λ„ 무관)
  • 지넀릭 클래슀둜 객체λ₯Ό μ„ μ–Έ μ‹œ μ°Έμ‘°λ³€μˆ˜μ™€ μƒμ„±μžμ— νƒ€μž… T λŒ€μ‹  μ‹€μ œ νƒ€μž…μ„ 지정
  • ν•˜μœ„ ν˜Έν™˜μ„ μœ„ν•΄ μ˜ˆμ „μ˜ λ°©μ‹μœΌλ‘œ 객체λ₯Ό μƒμ„±ν•˜λŠ” 것도 ν—ˆμš©ν•˜μ§€λ§Œ μ•ˆμ „ν•˜μ§€ μ•Šλ‹€λŠ” κ²½κ³  λ°œμƒ
    • Objectλ₯Ό μ§€μ •ν•˜λ©΄ κ²½κ³  λ°œμƒ X

μ§€λ„€λ¦­μŠ€μ˜ μš©μ–΄

  • Example : 지넀릭 클래슀
  • T : νƒ€μž… λ³€μˆ˜ λ˜λŠ” νƒ€μž… λ§€κ°œλ³€μˆ˜
  • Example : μ›μ‹œνƒ€μž…
  • μ§€μ •λœ νƒ€μž…μ„ λ§€κ°œλ³€μˆ˜ν™”λœ νƒ€μž…μ΄λΌκ³  뢀름
  • 컴파일 ν›„μ—λŠ” μ›μ‹œνƒ€μž…μœΌλ‘œ λ°”λ€œ (지넀릭 νƒ€μž…μ΄ 제거됨)

μ§€λ„€λ¦­μŠ€μ˜ μ œν•œ

  • 객체 생성 μ‹œ κ°μ²΄λ³„λ‘œ λ‹€λ₯Έ νƒ€μž…μ„ μ§€μ •ν•˜λŠ” 것을 ν—ˆμš©
  • λͺ¨λ“  객체에 λ™μΌν•˜κ²Œ λ™μž‘ν•΄μ•Ό ν•˜λŠ” static 멀버에 νƒ€μž… λ³€μˆ˜ Tλ₯Ό μ‚¬μš©ν•  수 μ—†μŒ
  • new T[10]κ³Ό 같이 new μ—°μ‚°μžμ™€ ν•¨κ»˜ μ‚¬μš©ν•  수 μ—†μŒ
    • 컴파일 μ‹œμ μ— νƒ€μž… Tκ°€ 무엇인지 μ •ν™•νžˆ μ•Œμ•„μ•Ό ν•˜λ―€λ‘œ
    • 지넀릭 배열을 κΌ­ 생성해야 ν•˜λ©΄ new μ—°μ‚°μž λŒ€μ‹  newInstance()와 같은 λ™μ μœΌλ‘œ 객체λ₯Ό μƒμ„±ν•˜λŠ” λ©”μ„œλ“œ or Object 배열을 μƒμ„±ν•΄μ„œ λ³΅μ‚¬ν•œ ν›„ ν˜•λ³€ν™˜

1.3 지넀릭 클래슀의 객체 생성과 μ‚¬μš©

  • μ°Έμ‘°λ³€μˆ˜μ™€ μƒμ„±μžμ— λŒ€μž…λœ νƒ€μž…μ΄ μΌμΉ˜ν•΄μ•Ό 됨
    • μΌμΉ˜ν•˜μ§€ μ•ŠμœΌλ©΄ μ—λŸ¬ λ°œμƒ
    • 두 νƒ€μž…μ΄ 상속관계여도 μ—λŸ¬ λ°œμƒ
    • 두 지넀릭 클래슀의 νƒ€μž…μ΄ 상속관계이며 λŒ€μž…λœ νƒ€μž…μ΄ 같은 것은 ν—ˆμš©
    • JDK 1.7λΆ€ν„°λŠ” 좔정이 κ°€λŠ₯ν•œ 경우 νƒ€μž… μƒλž΅ κ°€λŠ₯
  • μƒμ„±λœ 객체의 λ©”μ†Œλ“œκ°€ λ§€κ°œλ³€μˆ˜λ‘œ νƒ€μž… λ³€μˆ˜ 객체λ₯Ό 받을 λ•Œ νƒ€μž… λ³€μˆ˜μ˜ μžμ†λ“€λ„ λ§€μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜κ°€ 될 수 있음

1.4 μ œν•œλœ 지넀릭 클래슀

  • T만 μ„ μ–Έν•˜λ©΄ λͺ¨λ“  μ’…λ₯˜μ˜ νƒ€μž…μ„ 지정할 수 있음
  • μ œλ„€λ¦­ νƒ€μž…μ— extendsλ₯Ό μ‚¬μš©ν•˜λ©΄ νŠΉμ • νƒ€μž…μ˜ μžμ†λ“€λ§Œ λŒ€μž…ν•  수 있게 μ œν•œ κ°€λŠ₯
  • μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ” μ œμ•½ μ—­μ‹œ extends둜 ν‘œν˜„
    • implementsλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμŒμ— 주의
    • μžμ† μ œμ•½κ³Ό κ΅¬ν˜„ μΈν„°νŽ˜μ΄μŠ€κ°€ μ‘΄μž¬ν•œλ‹€λ©΄ & 기호둜 μ—°κ²° (<T extends ExampleClass & ExampleInterface>)

1.5 μ™€μΌλ“œ μΉ΄λ“œ

  • ν•˜λ‚˜μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ μ„œλ‘œ λ‹€λ₯Έ νƒ€μž…μ— λŒ€μž…λœ μ—¬λŸ¬ 지넀릭 객체λ₯Ό 닀루기 μœ„ν•΄ μ‚¬μš©
    • λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œλ§ˆλ‹€ λ‹€λ₯Έ νƒ€μž…μ„ λŒ€μž…ν•΄μ•Ό ν•  λ•Œ μ‚¬μš©
  • <T extends Example> vs <? extends Example>
    • <T extends Example>λŠ” λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œλ§ˆλ‹€ λ‹€λ₯Έ 지넀릭 νƒ€μž…μ„ λŒ€μž…ν•  수 있게 ν•œ 것
    • <? extends Example>λŠ” ν•˜λ‚˜μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ μ„œλ‘œ λ‹€λ₯Έ νƒ€μž…μ— λŒ€μž…λœ μ—¬λŸ¬ 지넀릭 객체λ₯Ό 닀루기 μœ„ν•œ 것
  • <? extends T> : μ™€μΌλ“œ μΉ΄λ“œμ˜ μƒν•œ μ œν•œ. T와 κ·Έ μžμ†λ“€λ§Œ κ°€λŠ₯
  • <? super T> : μ™€μΌλ“œ μΉ΄λ“œμ˜ ν•˜ν•œ μ œν•œ. T와 κ·Έ μ‘°μƒλ“€λ§Œ κ°€λŠ₯
  • <?> : μ œν•œ μ—†μŒ. λͺ¨λ“  νƒ€μž…μ΄ κ°€λŠ₯. (<? extends Object>와 동일)
  TestList<Parent> testList = new TestList<Parent>(); // ν—ˆμš©
  TestList<Parent> childTestList = new TestList<Child1>(); // μ—λŸ¬

  TestList<? extends Parent> wildCardChildTestList = new TestList<Child1>(); // ν—ˆμš©
  wildCardChildTestList = new TestList<Child2>(); // ν—ˆμš©
  wildCardChildTestList = new TestList<Child3>(); // ν—ˆμš©

1.6 지넀릭 λ©”μ„œλ“œ

  • λ©”μ„œλ“œμ˜ 선언뢀에 지넀릭 νƒ€μž…μ΄ μ„ μ–Έλœ λ©”μ„œλ“œ (클래슀의 νƒ€μž… λ³€μˆ˜κ°€ μ„ μ–Έλ˜λŠ” 것이 μ•„λ‹˜!)
  • 지넀릭 ν΄λž˜μŠ€μ— μ •μ˜λœ νƒ€μž… λ§€κ°œλ³€μˆ˜μ™€ 지넀릭 λ©”μ„œλ“œμ— μ •μ˜λœ νƒ€μž… λ§€κ°œλ³€μˆ˜λŠ” μ „ν˜€ λ³„κ°œμ˜ 것
    • 같은 문자 T 일지라도
  • λ©”μ„œλ“œμ— μ„ μ–Έλœ 지넀릭 νƒ€μž…μ€ 지역 λ³€μˆ˜λ₯Ό μ„ μ–Έν•œ 것과 κ°™μŒ
    • λ©”μ„œλ“œ λ‚΄μ—μ„œλ§Œ μ‚¬μš©λ  것
  • λ©”μ„œλ“œ 호좜 μ‹œ νƒ€μž… λ³€μˆ˜μ— νƒ€μž…μ„ λŒ€μž…ν•΄μ•Ό ν•˜μ§€λ§Œ λŒ€λΆ€λΆ„μ˜ 경우 μ»΄νŒŒμΌλŸ¬κ°€ μΆ”μ • κ°€λŠ₯ν•˜λ―€λ‘œ μƒλž΅
    • λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ νƒ€μž…μ„ μƒλž΅ν•  수 μ—†λŠ” κ²½μš°μ—λŠ” μ°Έμ‘°λ³€μˆ˜λ‚˜ 클래슀 이름 μƒλž΅ λΆˆκ°€
  • public static <T extends Comparable<? super T>> void sort(List<T> list)
    • νƒ€μž… Tλ₯Ό μš”μ†Œλ‘œ ν•˜λŠ” Listλ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ ν—ˆμš©
    • TλŠ” Comparable을 κ΅¬ν˜„ν•œ ν΄λž˜μŠ€μ΄μ–΄μ•Ό 함
    • Comparable<? super T>μ΄λ―€λ‘œ Comparable의 λ§€κ°œλ³€μˆ˜λŠ” T와 T의 쑰상 νƒ€μž…μ΄ λͺ¨λ‘ κ°€λŠ₯

1.7 지넀릭 νƒ€μž…μ˜ ν˜•λ³€ν™˜

  • 지넀릭 νƒ€μž…κ³Ό μ›μ‹œ νƒ€μž… κ°„μ˜ ν˜•λ³€ν™˜μ€ κ°€λŠ₯
    • κ²½κ³ κ°€ λ°œμƒν•  뿐
  • λŒ€μž…λœ νƒ€μž…κ³Ό λ‹€λ₯Έ 지넀릭 νƒ€μž… κ°„μ—λŠ” ν˜•λ³€ν™˜ λΆˆκ°€λŠ₯
    • Object여도 λΆˆκ°€λŠ₯
  • νŠΉμ • νƒ€μž…μ„ ? extends Object으둜의 ν˜•λ³€ν™˜λ„ κ°€λŠ₯
    • λ°˜λŒ€λ‘œλ„ κ°€λŠ₯ν•˜μ§€λ§Œ ν™•μΈλ˜μ§€ μ•Šμ€ ν˜•λ³€ν™˜μ΄λΌλŠ” κ²½κ³  λ°œμƒ
  • Optional<Object>λ₯Ό Optional<String>으둜 직접 ν˜•λ³€ν™˜ ν•˜λŠ” 것은 λΆˆκ°€λŠ₯ν•˜μ§€λ§Œ μ™€μΌλ“œ μΉ΄λ“œκ°€ ν¬ν•¨λœ 지넀릭 νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜ν•˜λ©΄ κ°€λŠ₯
    • Optional<Object> -> Optional<?> -> Optional<T>

1.8 지넀릭 νƒ€μž…μ˜ 제거

  • μ»΄νŒŒμΌλŸ¬λŠ” 지넀릭 νƒ€μž…μ„ μ΄μš©ν•΄μ„œ μ†ŒμŠ€νŒŒμΌμ„ 체크 ν›„ ν•„μš”ν•œ 곳에 ν˜•λ³€ν™˜μ„ λ„£μ–΄μ€€ λ’€ 지넀릭 νƒ€μž… 제거
    • *.class νŒŒμΌμ—λŠ” 지넀릭 νƒ€μž…μ— λŒ€ν•œ 정보가 μ—†μŒ
  • ν•˜νœ˜ ν˜Έν™˜μ„±μ„ μœ μ§€ν•˜κΈ° μœ„ν•¨
    • μ›μ‹œ νƒ€μž…μœΌλ‘œ μž‘μ„±ν•  수 μžˆλ„λ‘ ν•œ 것도 λ§ˆμ°¬κ°€μ§€
  • 기본적인 제거 κ³Όμ •
    1. 지넀릭 νƒ€μž…μ˜ 경계λ₯Ό 제거 (~ extends XXXλŠ” XXX둜 λ³€κ²½, T만 μžˆμ„ μ‹œ Object둜 λ³€κ²½)
    2. 지넀릭 νƒ€μž…μ„ μ œκ±°ν•œ ν›„ νƒ€μž…μ΄ μΌμΉ˜ν•˜μ§€ μ•ŠμœΌλ©΄ ν˜•λ³€ν™˜ μΆ”κ°€

2. μ—΄κ±°ν˜•(enums)

2.1 μ—΄κ±°ν˜•μ΄λž€?

  • μ„œλ‘œ κ΄€λ ¨λœ μƒμˆ˜λ₯Ό νŽΈλ¦¬ν•˜κ²Œ μ„ μ–Έν•˜κΈ° μœ„ν•œ 것
  • JDK 1.5λΆ€ν„° μƒˆλ‘œ μΆ”κ°€
  • κ°’λΏλ§Œ μ•„λ‹ˆλΌ νƒ€μž…λ„ 관리함 (Cμ–Έμ–΄μ˜ μ—΄κ±°ν˜•λ³΄λ‹€ ν–₯μƒλœ 것)
    • νƒ€μž…μ— μ•ˆμ „ν•œ μ—΄κ±°ν˜•(μ‹€μ œ κ°’λΏλ§Œ μ•„λ‹ˆλΌ νƒ€μž…λ„ 체크)
  • μƒμˆ˜μ™€ λ‹€λ₯΄κ²Œ μ—΄κ±°ν˜• μƒμˆ˜λŠ” 기쑴의 μ†ŒμŠ€λ₯Ό λ‹€μ‹œ μ»΄νŒŒμΌν•˜μ§€ μ•Šμ•„λ„ 됨

2.2 μ—΄κ±°ν˜•μ˜ μ •μ˜μ™€ μ‚¬μš©

  • enum μ—΄κ±°ν˜•μ΄λ¦„ {μƒμˆ˜λͺ…1, μƒμˆ˜λͺ…2, ...}
  • static λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λ“― μ—΄κ±°ν˜•μ΄λ¦„.μƒμˆ˜λͺ…μœΌλ‘œ μ°Έμ‘°
  • ==둜 비ꡐ가 κ°€λŠ₯ν•˜λ‚˜ <,> 같은 λΉ„κ΅μ—°μ‚°μžλŠ” μ‚¬μš© λΆˆκ°€λŠ₯
    • compareTo()λŠ” μ‚¬μš© κ°€λŠ₯
  • switch 문의 case 문에도 μ‚¬μš©κ°€ λŠ₯ν•œλ° μ—΄κ±°ν˜•μ˜ 이름은 적지 말고 μƒμˆ˜λ§Œ 적어야 함

λͺ¨λ“  μ—΄κ±°ν˜•μ˜ 쑰상 - java.lang.Enum

  • getDeclaringClass(), name(), ordinal(), valueOf()λ₯Ό Enumμ—μ„œ κ°–κ³  있음
    • ordinal()은 0λΆ€ν„° μ‹œμž‘ν•˜λŠ” μ—΄κ±°ν˜•μ˜ μˆœμ„œ λ°˜ν™˜
    • name()은 μ—΄κ±°ν˜•μ˜ 이름을 λ¬Έμžμ—΄λ‘œ λ°˜ν™˜
  • values(), valueOf(String name)은 μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μ μœΌλ‘œ μΆ”κ°€ν•΄ μ£ΌλŠ” λ©”μ„œλ“œ
    • values()λŠ” μ—΄κ±°ν˜•μ˜ λͺ¨λ“  μƒμˆ˜λ₯Ό 배열에 λ‹΄μ•„ λ°˜ν™˜
    • valueof()λŠ” μƒμˆ˜μ— λŒ€ν•œ μ°Έμ‘°λ₯Ό μ–»κ²Œ ν•΄μ€Œ

2.3 μ—΄κ±°ν˜•μ— 멀버 μΆ”κ°€ν•˜κΈ°

  • μ—΄κ±°ν˜•μ˜ 이름 μ˜†μ— μ›ν•˜λŠ” 값을 κ΄„ν˜Έμ™€ ν•¨κ»˜ 적어주면 κ°€λŠ₯
    • κ·Έ ν›„ μ§€μ •λœ 값을 μ €μž₯ν•  수 μžˆλŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ™€ μƒμ„±μžλ₯Ό μƒˆλ‘œ μΆ”κ°€ 해야함
      • μ—΄κ±°ν˜• μƒμˆ˜λ₯Ό λͺ¨λ‘ μ •μ˜ν•œ λ‹€μŒ λ‹€λ₯Έ 멀버듀을 μΆ”κ°€ 해야함
      • μ—΄κ±°ν˜• μƒμˆ˜μ˜ λ§ˆμ§€λ§‰μ— ';'도 μžŠμ§€ 말 것
  • μ—΄κ±°ν˜• μƒμ„±μžλŠ” μ œμ–΄μžκ°€ λ¬΅μ‹œμ μœΌλ‘œ private
  • μ—¬λŸ¬ 값에 λ§žλŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ™€ μƒμ„±μžλ₯Ό μƒˆλ‘œ μΆ”κ°€ν•œλ‹€λ©΄ μ—΄κ±°ν˜• μƒμˆ˜μ— μ—¬λŸ¬ 값을 μ €μž₯ν•  수 있음

μ—΄κ±°ν˜•μ— 좔상 λ©”μ„œλ“œ μΆ”κ°€ν•˜κΈ°

  • μ—΄κ±°ν˜•μ— μΆ”μƒλ©”μ„œλ“œλ₯Ό μ„ μ–Έν•˜λ©΄ 각 μ—΄κ±°ν˜• μƒμˆ˜κ°€ 좔상 λ©”μ„œλ“œλ₯Ό λ°˜λ“œμ‹œ κ΅¬ν˜„ν•΄μ•Ό 함

2.4 μ—΄κ±°ν˜•μ˜ 이해

  • μ—΄κ±°ν˜• μƒμˆ˜ ν•˜λ‚˜ν•˜λ‚˜κ°€ 객체
  • Enum 클래슀의 static μƒμˆ˜μΈ μ—΄κ±°ν˜• μƒμˆ˜λ“€μ˜ 값은 객체의 μ£Όμ†Œμ΄λ©° λ°”λ€Œμ§€ μ•ŠμœΌλ―€λ‘œ ==둜 비ꡐ가 κ°€λŠ₯ν•œ 것
    • μ„œλ‘œμ˜ ordinal을 λΉΌμ£ΌλŠ” λ°©μ‹μœΌλ‘œ κ΅¬ν˜„

3. μ• λ„ˆν…Œμ΄μ…˜(annotation)

3.1 μ• λ„ˆν…Œμ΄μ…˜μ΄λž€?

  • javadoc을 λ§Œλ“€μ–΄λ‚΄λŠ” μ£Όμ„μ˜ @이 뢙은 νƒœκ·Έ κΈ°λŠ₯을 μ‘μš©ν•˜μ—¬ λ§Œλ“  κΈ°λŠ₯
  • ν”„λ‘œκ·Έλž¨μ˜ μ†ŒμŠ€μ½”λ“œ μ•ˆμ— λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ„ μœ„ν•œ 정보λ₯Ό 미리 μ•½μ†λœ ν˜•μ‹μœΌλ‘œ ν¬ν•¨μ‹œν‚¨ 것
  • μ£Όμ„μ²˜λŸΌ ν”„λ‘œκ·Έλž˜λ° 언어에 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠμœΌλ©΄μ„œλ„ λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ—κ²Œ μœ μš©ν•œ 정보λ₯Ό 제곡
    • κ΄€λ ¨ μžˆλŠ” ν”„λ‘œκ·Έλž¨μ—λ§Œ 영ν–₯
  • JDKμ—μ„œ μ œκ³΅ν•˜λŠ” ν‘œμ€€ μ—λ„ˆν…Œμ΄μ…˜μ€ 주둜 μ»΄νŒŒμΌλŸ¬μ—κ²Œ μœ μš©ν•œ 정보 제곡
    • μƒˆλ‘œμš΄ μ• λ„ˆν…Œμ΄μ…˜μ„ μ •μ˜ν•  λ•Œ μ‚¬μš©ν•˜λŠ” 메타 μ• λ„ˆν…Œμ΄μ…˜λ„ 제곡

3.2 ν‘œμ€€ μ• λ„ˆν…Œμ΄μ…˜

  • ν‘œμ€€ μ• λ„ˆν…Œμ΄μ…˜
    • @Override, @Deprecated, @SuppressWarnings, @SafeVarags, @FunctionalInterface, @Native
  • ν‘œμ€€ μ• λ„ˆν…Œμ΄μ…˜ 쀑 메타 μ• λ„ˆν…Œμ΄μ…˜
    • @Target, @Documented, @Inherited, @Retention, @Repeatable

@Override

  • λ©”μ„œλ“œ μ•žμ—λ§Œ 뢙일 수 있음
  • μ‘°μƒμ˜ λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”© ν•˜λŠ” κ²ƒμ΄λΌλŠ” κ±Έ μ»΄νŒŒμΌλŸ¬μ—κ²Œ μ•Œλ €μ€Œ
  • λ©”μ„œλ“œ 이름을 잘 λͺ» μ“°λ©΄ μ»΄νŒŒμΌλŸ¬κ°€ μ—λŸ¬ 좜λ ₯
  • ν•„μˆ˜λŠ” μ•„λ‹ˆμ§€λ§Œ μ‹€μˆ˜λ₯Ό 방지 ν•΄μ£ΌλŠ” μ• λ„ˆν…Œμ΄μ…˜

@Deprecated

  • 더 이상 μ‚¬μš©λ˜μ§€ μ•ŠλŠ” ν•„λ“œλ‚˜ λ©”μ„œλ“œμ— λΆ™μ΄λŠ” μ• λ„ˆν…Œμ΄μ…˜
  • λ‹€λ₯Έ κ²ƒμœΌλ‘œ λŒ€μ²΄λ˜μ—ˆμœΌλ‹ˆ 더 이상 μ‚¬μš©ν•˜μ§€ μ•Šμ„ 것을 κΆŒν•˜λŠ” 의미

@FunctionalInterface

  • ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ„ μ–Έν•  λ•Œ 이 μ• λ„ˆν…Œμ΄μ…˜μ„ 뢙이면 μ»΄νŒŒμΌλŸ¬κ°€ μ˜¬λ°”λ₯Έ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μΈμ§€ 확인
  • 잘λͺ»λœ 경우 μ»΄νŒŒμΌλŸ¬κ°€ μ—λŸ¬ 좜λ ₯
  • ν•„μˆ˜λŠ” μ•„λ‹ˆμ§€λ§Œ μ‹€μˆ˜λ₯Ό 방지해 μ£ΌλŠ” μ• λ„ˆν…Œμ΄μ…˜

@SuppressWarnings

  • 묡인해야 ν•˜λŠ” κ²½κ³ κ°€ λ°œμƒν•˜λŠ” λŒ€μƒμ— λΆ™μ—¬μ„œ 컴파일 후에 μ–΄λ–€ κ²½κ³  λ©”μ‹œμ§€λ„ λ‚˜νƒ€λ‚˜μ§€ μ•Šκ²Œ 함
  • -Xlint μ˜΅μ…˜μœΌλ‘œ λ‚˜μ˜€λŠ” 경고의 μ’…λ₯˜ 쀑 λŒ€κ΄„ν˜Έ[]μ•ˆμ— μžˆλŠ” κ²½κ³ λ₯Ό μ–΅μ œν•  수 있음
  • μ–΅μ œν•˜λŠ” 경고둜 주둜 μ‚¬μš©λ˜λŠ” 것은 "deprecation", "uncheked", "rawtypes", "varargs"
  • λ°°μ—΄μ²˜λŸΌ κ΄„ν˜Έ{}λ₯Ό μ‚¬μš©ν•΄ λ‘˜ μ΄μƒμ˜ κ²½κ³ λ₯Ό λ™μ‹œμ— μ–΅μ œν•  μˆ˜λ„ 있음
  • main() λ©”μ†Œλ“œμ— λΆ™μ—¬μ„œ ν•΄λ‹Ή 경고와 κ΄€λ ¨λœ λͺ¨λ“  메세지λ₯Ό μ–΅μ œν•  수 μžˆμ§€λ§Œ μ–΅μ œ λ²”μœ„λ₯Ό μ΅œμ†Œν™”ν•˜λŠ” 것이 μ’‹λ‹€.

@SafeVarargs

  • 컴파일 후에도 μ œκ±°λ˜μ§€ μ•ŠλŠ” νƒ€μž…μ€ reifiable, μ œκ±°λ˜λŠ” νƒ€μž…μ€ non-reifiable νƒ€μž…
    • 지넀릭 νƒ€μž…λ“€μ€ λŒ€λΆ€λΆ„ 컴파일 μ‹œμ— μ œκ±°λ˜λ―€λ‘œ non-reifiable νƒ€μž…
  • λ©”μ„œλ“œμ— μ„ μ–Έλœ κ°€λ³€μΈμžμ˜ νƒ€μž…μ΄ non-reifiable νƒ€μž…μΌ 경우 ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό μ„ μ–Έν•˜λˆˆ λΆ€λΆ„κ³Ό ν˜ΈμΆœν•˜λŠ” λΆ€λΆ„μ˜ "uncheked" κ²½κ³ λ₯Ό μ–΅μ œν•˜κΈ° μœ„ν•΄μ„  @SafeVarargs μ‚¬μš©
    • λ§€κ°œλ³€μˆ˜κ°€ κ°€λ³€μΈμžμ΄λ©΄μ„œ μ œλ„€λ¦­ νƒ€μž…μΈ 경우 (ex- Arrays.asList(T... a))
    • λ©”μ„œλ“œμ— μ„ μ–Έλœ νƒ€μž… TλŠ” 컴파일 κ³Όμ •μ—μ„œ Object둜 λ°”λ€œ
    • μ»΄νŒŒμΌλŸ¬κ°€ λͺ¨λ“  객체가 λ“€μ–΄μ˜¬ 수 μžˆμŒμ„ κ²½κ³ 
    • ν•˜μ§€λ§Œ μ§€λ„€λ¦­μŠ€λ₯Ό μ‚¬μš©ν–ˆκΈ° λ•Œλ¬Έμ— μ»΄νŒŒμΌλŸ¬κ°€ 호좜 뢀뢄을 μ²΄ν¬ν•΄μ„œ T 외에 λ‹€λ₯Έ νƒ€μž…μ΄ λ“€μ–΄κ°ˆ 수 μ—†κ²Œ ν•  κ²ƒμ΄λ―€λ‘œ μœ„ μ½”λ“œλŠ” μ•ˆμ •
    • μ΄λ•Œ @SafeVarargsλ₯Ό λΆ™μž„
  • @SuppressWarnings("unchecked")λŠ” λ©”μ„œλ“œ μ„ μ–Έ λΆ€λΆ„κ³Ό ν˜ΈμΆœλ˜λŠ” κ³³μ—μ„œ μ• λ„ˆν…Œμ΄μ…˜μ„ λΆ™μ—¬μ•Ό ν•˜μ§€λ§Œ @SafeVarargsλŠ” λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” κ³³μ—μ„œ λ°œμƒν•˜λŠ” 경고도 μ–΅μ œ
  • 'varargs' κ²½κ³ λŠ” μ–΅μ œν•  수 μ—†μœΌλ―€λ‘œ @SuppressWarnings("varargs")와 ν•¨κ»˜ μ–΄λ…Έν…Œμ΄μ…˜μ„ λΆ™μž„

3.3 메타 μ• λ„ˆν…Œμ΄μ…˜

  • 메타 μ• λ„ˆν…Œμ΄μ…˜μ€ μ• λ„ˆν…Œμ΄μ…˜μ„ μ •μ˜ν•  λ•Œ μ‚¬μš©

@Target

  • μ• λ„ˆν…Œμ΄μ…˜μ΄ 적용 κ°€λŠ₯ν•œ λŒ€μƒμ„ μ§€μ •ν•˜λŠ” 데 μ‚¬μš©
  • μ—¬λŸ¬ 개의 값은 κ΄„ν˜Έ{}λ₯Ό μ‚¬μš©ν•΄μ•Ό 함

@Retention

  • μ• λ„ˆν…Œμ΄μ…˜μ΄ μœ μ§€(retention)λ˜λŠ” 기간을 μ§€μ •ν•˜λŠ” 데 μ‚¬μš©
  • μ»΄νŒŒμΌλŸ¬κ°€ μ‚¬μš©ν•˜λŠ” μ• λ„ˆν…Œμ΄μ…˜μ˜ μœ μ§€ 정책은 'SOURCE'
  • μœ μ§€ 정책이 'RUNTIME'일 μ‹œ μ‹€ν–‰ μ‹œμ— λ¦¬ν”Œλ ‰μ…˜μ„ 톡해 클래슀 νŒŒμΌμ— μ €μž₯된 μ• λ„ˆν…Œμ΄μ…˜μ„ 정보λ₯Ό 읽은 λ’€ 처리
  • μœ μ§€ μ •μ±… 'CLASS'λŠ” μ»΄νŒŒμΌλŸ¬κ°€ μ• λ„ˆν…Œμ΄μ…˜μ˜ 정보λ₯Ό 클래슀 νŒŒμΌμ— μ €μž₯ν•  수 있게 ν•΄μ€Œ
    • 클래슀 파일이 JVM에 λ‘œλ”©λ  μ‹œ μ• λ„ˆν…Œμ΄μ…˜μ˜ 정보가 λ¬΄μ‹œλ˜λ―€λ‘œ μ‹€ν–‰ μ‹œμ—λŠ” 정보λ₯Ό 얻을 수 μ—†μœΌλ―€λ‘œ 잘 μ‚¬μš© X

@Documented

  • μ• λ„ˆν…Œμ΄μ…˜μ— λŒ€ν•œ 정보가 javadoc으둜 μž‘μ„±ν•œ λ¬Έμ„œμ— ν¬ν•¨λ˜λ„λ‘ 함

@Inherited

  • μ• λ„ˆν…Œμ΄μ…˜μ΄ μžμ† ν΄λž˜μŠ€μ— μƒμ†λ˜λ„λ‘ 함
    • 쑰상 ν΄λž˜μŠ€μ— 뢙이면 μžμ† ν΄λž˜μŠ€λ„ 이 μ• λ„ˆν…Œμ΄μ…˜μ΄ 뢙은 것과 같이 인식

@Repeatable

  • @Repeatable이 뢙은 μ• λ„ˆν…Œμ΄μ…˜μ€ μ—¬λŸ¬ 번 뢙일 수 있음
  • 이 μ• λ„ˆν…Œμ΄μ…˜λ“€μ„ ν•˜λ‚˜λ‘œ λ¬Άμ–΄μ„œ λ‹€λ£° 수 μžˆλŠ” μ• λ„ˆν…Œμ΄μ…˜λ„ μΆ”κ°€λ‘œ μ •μ˜ν•΄μ•Ό 함

@Native

  • λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œμ— μ˜ν•΄ μ°Έμ‘°λ˜λŠ” μƒμˆ˜ ν•„λ“œμ— λΆ™μ΄λŠ” μ• λ„ˆν…Œμ΄μ…˜
    • λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œλŠ” JVM이 μ„€μΉ˜λœ OS의 λ©”μ„œλ“œλ₯Ό 의미
    • 보톡 Cμ–Έμ–΄λ‘œ μž‘μ„±
    • μžλ°”μ—μ„œλŠ” λ©”μ„œλ“œμ˜ μ„ μ–ΈλΆ€λ§Œ μ •μ˜ν•˜κ³  κ΅¬ν˜„μ€ X
    • μΆ”μƒλ©”μ„œλ“œ 처럼 μ„ μ–ΈλΆ€λ§Œ 있고 λͺΈν†΅μ΄ μ—†μŒ

3.4 μ• λ„ˆν…Œμ΄μ…˜ νƒ€μž… μ •μ˜ν•˜κΈ°

  • @ 기호λ₯Ό 뢙이고 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•˜λŠ” 것과 동일

μ• λ„ˆν…Œμ΄μ…˜μ˜ μš”μ†Œ

  • μ• λ„ˆν…Œμ΄μ…˜ 내에 μ„ μ–Έλœ λ©”μ„œλ“œλ₯Ό μ• λ„ˆν…Œμ΄μ…˜ μš”μ†ŒλΌκ³  뢀름
    • λ°˜ν™˜κ°’μ΄ 있고 λ§€κ°œλ³€μˆ˜λŠ” μ—†λŠ” 좔상 λ©”μ„œλ“œμ˜ ν˜•νƒœ
    • 상속을 톡해 κ΅¬ν˜„ν•˜μ§€ μ•Šμ•„λ„ 됨
    • μ• λ„ˆν…Œμ΄μ…˜μ„ μ μš©ν•  λ•Œ 이 μš”μ†Œλ“€μ˜ 값을 빠짐없이 지정해 μ€˜μ•Ό 함
    • 지정할 λ•Œ μˆœμ„œλŠ” 상관 X
    • 각 μš”μ†ŒλŠ” 기본값을 κ°€μ§ˆ 수 있고 값을 μ§€μ •ν•˜μ§€ μ•Šμ„ μ‹œ μ‚¬μš©λ¨
    • μ—λ„ˆν…Œμ΄μ…˜μ˜ μš”μ†Œκ°€ ν•˜λ‚˜λΏμ΄κ³  이름이 value 일 땐 μš”μ†Œμ˜ 이름을 μƒλž΅ ν›„ κ°’λ§Œ 적어도 적용 κ°€λŠ₯
    • μš”μ†Œμ˜ νƒ€μž…μ΄ 배열인 경우 κ΄„ν˜Έ{}λ₯Ό μ‚¬μš©ν•΄μ„œ μ—¬λŸ¬ 개의 값을 지정
    • κΈ°λ³Έκ°’ λ˜ν•œ κ΄„ν˜Έ{}둜 지정 κ°€λŠ₯

java.lang.annotation.Annotation

  • λͺ¨λ“  μ• λ„ˆν…Œμ΄μ…˜μ˜ 쑰상
  • μ• λ„ˆν…Œμ΄μ…˜μ€ 상속이 ν—ˆμš©λ˜μ§€ μ•ŠμœΌλ―€λ‘œ λͺ…μ‹œμ μœΌλ‘œ extends 지정 λΆˆκ°€λŠ₯
  • Annotaion은 일반적인 μΈν„°νŽ˜μ΄μŠ€λ‘œ μ •μ˜λ˜μ–΄ 있음
    • equals(), hashCode(), toString()κ³Ό 같은 λ©”μ„œλ“œλ“€μ΄ μ •μ˜λ˜μ–΄ μžˆμœΌλ―€λ‘œ μ• λ„ˆν…Œμ΄μ…˜ κ°μ²΄μ—μ„œ 호좜 κ°€λŠ₯
  • TestClass.class.getAnnotations()둜 TestClass에 적용된 λͺ¨λ“  μ• λ„ˆν…Œμ΄μ…˜ 호좜 κ°€λŠ₯ 및 μΈν„°νŽ˜μ΄μŠ€μ— μ •μ˜λœ λ©”μ„œλ“œ 호좜 κ°€λŠ₯

마컀 μ• λ„ˆν…Œμ΄μ…˜ Marker Annotation

  • μš”μ†Œκ°€ ν•˜λ‚˜λ„ μ •μ˜λ˜μ§€ μ•Šμ€ μ• λ„ˆν…Œμ΄μ…˜μ„ 마컀 μ• λ„ˆν…Œμ΄μ…˜μ΄λΌκ³  뢀름
    • 값을 지정할 ν•„μš”κ°€ μ—†λŠ” μ• λ„ˆν…Œμ΄μ…˜λ“€

μ• λ„ˆν…Œμ΄μ…˜ μš”μ†Œμ˜ κ·œμΉ™

  • λ°˜λ“œμ‹œ μ§€μΌœμ•Ό ν•˜λŠ” κ·œμΉ™λ“€
    • μš”μ†Œμ˜ νƒ€μž…μ€ κΈ°λ³Έν˜•, String, enum, μ• λ„ˆν…Œμ΄μ…˜, class만 ν—ˆμš©
    • () μ•ˆμ— λ§€κ°œλ³€μˆ˜λ₯Ό μ„ μ–Έν•  수 μ—†λ‹€.
    • μ˜ˆμ™Έλ₯Ό μ„ μ–Έν•  수 μ—†λ‹€.
    • μš”μ†Œλ₯Ό νƒ€μž… λ§€κ°œλ³€μˆ˜λ‘œ μ •μ˜ν•  수 μ—†λ‹€.
  • 클래슀 κ°μ²΄μ—λŠ” ν•΄λ‹Ή ν΄λž˜μŠ€μ— λŒ€ν•œ λͺ¨λ“  정보λ₯Ό κ°–κ³  있고 μ• λ„ˆν…Œμ΄μ…˜μ˜ 정보도 ν¬ν•¨λ˜μ–΄ 있음