[JAVA] 19. μ§€λ„€λ¦­μŠ€ Generics(μ™€μΌλ“œ μΉ΄λ“œ, 지넀릭 λ©”μ„œλ“œ, 지넀릭 νƒ€μž…μ˜ ν˜•λ³€ν™˜, 지넀릭 νƒ€μž…μ˜ 제거), μ—΄κ±°ν˜• Enum, μ• λ„ˆν…Œμ΄μ…˜ (Annotation)

2022. 5. 15. 19:33ㆍJAVA/μžλ°”μ˜ 정석

728x90

 

 

https://hyejin.tistory.com/586

 

[JAVA] 18. μ§€λ„€λ¦­μŠ€ Generics

1️⃣ μ§€λ„€λ¦­μŠ€ Generics  μ§€λ„€λ¦­μŠ€λŠ” λ‹€μ–‘ν•œ νƒ€μž…μ˜ 객체듀을 λ‹€λ£¨λŠ” λ©”μ„œλ“œλ‚˜ μ»¬λ ‰μ…˜ ν΄λž˜μŠ€μ— 컴파일 μ‹œμ˜ νƒ€μž… 체크λ₯Ό ν•΄μ£ΌλŠ” κΈ°λŠ₯이닀. 객체의 νƒ€μž…μ„ 컴파일 μ‹œμ— μ²΄ν¬ν•˜κΈ° λ•Œλ¬Έμ— 객체의

hyejin.tistory.com

 

 

1️⃣ μ™€μΌλ“œ μΉ΄λ“œ 

< ? extends T> : μ™€μΌλ“œ μΉ΄λ“œμ˜ μƒν•œ μ œν•œ, T와 κ·Έ μžμ†λ“€λ§Œ κ°€λŠ₯ 
<? super T> : μ™€μΌλ“œ μΉ΄λ“œμ˜ ν•˜ν•œ μ œν•œ, T와 κ·Έ μ‘°μƒλ“€λ§Œ κ°€λŠ₯ 
<?> : μ œν•œ μ—†μŒ. λͺ¨λ“  νƒ€μž…μ΄ κ°€λŠ₯. <? extends Object>와 동일 

-> 지넀릭 νƒ€μž…μ— μ™€μΌλ“œ μΉ΄λ“œλ₯Ό μ“°λ©΄ μ—¬λŸ¬ νƒ€μž…μ„ λŒ€μž…ν•  수 μžˆλ‹€. 

 

 

2️⃣ 지넀릭 λ©”μ„œλ“œ 

λ©”μ„œλ“œ 선언뢀에 지넀릭 νƒ€μž…μ΄ μ„ μ–Έλœ λ©”μ„œλ“œλ₯Ό 지넀릭 λ©”μ„œλ“œλΌκ³  ν•œλ‹€. 

지넀릭 νƒ€μž…μ˜ μ„ μ–Έ μœ„μΉ˜λŠ” λ°˜ν™˜νƒ€μž… λ°”λ‘œ μ•žμ΄λ‹€. 

μ΄λ•Œ 지넀릭 ν΄λž˜μŠ€μ— μ •μ˜λœ νƒ€μž… λ§€κ°œλ³€μˆ˜μ™€ 지넀릭 λ©”μ„œλ“œμ— μ •μ˜λœ νƒ€μž… λ§€κ°œλ³€μˆ˜λŠ” μ „ν˜€ λ³„κ°œμ˜ 것이닀!!

-> FruitBox에 μ„ μ–Έλœ νƒ€μž… λ§€κ°œλ³€μˆ˜ T와 지넀릭 λ©”μ„œλ“œ sort에 μ„ μ–Έλœ νƒ€μž… λ§€κ°œλ³€μˆ˜ TλŠ” 문자만 같을 뿐 μ„œλ‘œ λ‹€λ₯Έ 것이닀. 

 

static λ©€λ²„μ—λŠ” νƒ€μž… λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 μ—†μ§€λ§Œ, 이처럼 λ©”μ„œλ“œμ— 지넀릭 νƒ€μž…μ„ μ„ μ–Έν•˜κ³  μ‚¬μš©ν•˜λŠ” 것은 κ°€λŠ₯ν•˜λ‹€. 

 

static Juice makeJuice(FruitBox<? extends Fruit> box) {

    String tmp = "";

    ...

    return new Juice(tmp);

-> 지넀릭 λ©”μ„œλ“œλ‘œ λ°”κΎΈκΈ° 

static <T extends Fruit> Juice makeJuice (FruitBox<T> box) {

   String tmp = "";

   ...

   return new Juice(tmp);

}

이 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•ŒλŠ” νƒ€μž… λ³€μˆ˜μ— νƒ€μž…μ„ λŒ€μž…ν•΄μ•Όν•œλ‹€. 

-> λŒ€λΆ€λΆ„μ˜ κ²½μš°μ—λŠ” μ»΄νŒŒμΌλŸ¬κ°€ νƒ€μž…μ„ μΆ”μ •ν•  수 있기 λ•Œλ¬Έμ— μƒλž΅ν•΄λ„ λœλ‹€. 

 

 

 

❗️ μ™€μΌλ“œ μΉ΄λ“œ, 지넀릭 λ©”μ„œλ“œ 

μ™€μΌλ“œ μΉ΄λ“œ : ν•˜λ‚˜μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ μ„œλ‘œ λ‹€λ₯Έ νƒ€μž…μ΄ λŒ€μž…λœ μ—¬λŸ¬ 지넀릭 객체λ₯Ό 닀루기 μœ„ν•œ 것이닀. 

지넀릭 λ©”μ„œλ“œ : λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ λ§ˆλ‹€ λ‹€λ₯Έ 지넀릭 νƒ€μž…μ„ λŒ€μž…ν•  수 있게 ν•œ 것이닀. 

 

 

3️⃣ 지넀릭 νƒ€μž…μ˜ ν˜•λ³€ν™˜ 

-> 지넀릭 νƒ€μž…κ³Ό μ›μ‹œνƒ€μž…μ˜ ν˜•λ³€ν™˜μ€ κ°€λŠ₯ν•˜μ§€λ§Œ, κ²½κ³ κ°€ λ°œμƒν•œλ‹€. 

 

Box<Object> box = null;

Box<String> strbox = null;

 

box = (Box<Object>)strbox; // error

strbox = (Box<String>)box; // error 

 

-> λŒ€μž…λœ νƒ€μž…μ΄ Object일지라도 λΆˆκ°€λŠ₯ν•˜λ‹€. 

 

-> 근데 μ™€μΌλ“œ μΉ΄λ“œκ°€ μ‚¬μš©λœ 지넀릭 νƒ€μž…μ€ ν˜•λ³€ν™˜ κ°€λŠ₯ν•˜λ‹€. 

근데 λ°˜λŒ€λ‘œμ˜ ν˜•λ³€ν™˜μ€ κ°€λŠ₯ν•˜μ§€λ§Œ, ν™•μΈλ˜μ§€ μ•Šμ€ ν˜•λ³€ν™˜μ΄λΌλŠ” κ²½κ³ κ°€ λ°”λž­ν•œλ‹€. 

FruitBox<? extends Fruit> 에 λŒ€μž…λ  수 μžˆλŠ” νƒ€μž…μ΄ μ—¬λŸ¬κ°œμΈλ°λ‹€κ°€ FruitBox<Apple>λ₯Ό μ œμ™Έν•œ λ‹€λ₯Έ νƒ€μž…μ€ FruitBox<Apple>둜 ν˜•λ³€ν™˜λ  수 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.

 

 

4️⃣ 지넀릭 νƒ€μž…μ˜ 제거 

μ»΄νŒŒμΌλŸ¬λŠ” 지넀릭 νƒ€μž…μ„ μ΄μš©ν•΄μ„œ μ†ŒμŠ€νŒŒμΌμ„ μ²΄ν¬ν•˜κ³ , ν•„μš”ν•œ 곳에 ν˜•λ³€ν™˜μ„ λ„£μ–΄μ€€λ‹€.

그리고 지넀릭 νƒ€μž…μ„ μ œκ±°ν•œλ‹€. 즉 컴파일된 (*.class) μ—λŠ” 지넀릭 νƒ€μž…μ— λŒ€ν•œ 정보가 μ—†λ‹€. 

 

μ΄λ ‡κ²Œ ν•˜λŠ” μ΄μœ λŠ” 지넀릭이 λ„μž…λ˜κΈ° μ΄μ „μ˜ μ†ŒμŠ€μ½”λ“œμ™€μ˜ ν˜Έν™˜μ„±μ„ μœ μ§€ν•˜κΈ° μœ„ν•΄μ„œμ΄λ‹€. 

jdk1.5λΆ€ν„° μ§€λ„€λ¦­μŠ€κ°€ λ„μž…λ˜μ—ˆμ§€λ§Œ, 아직도 μ›μ‹œ νƒ€μž…μ„ μ‚¬μš©ν•΄μ„œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 것을 ν—ˆμš©ν•œλ‹€. 

 

1. 지넀릭 νƒ€μž…μ˜ 경계λ₯Ό μ œκ±°ν•œλ‹€. 

-> 지넀릭 νƒ€μž…μ΄ <T extends Fruit> 라면 TλŠ” Fruit둜 μΉ˜ν™˜λœλ‹€. 

 

2. 지넀릭 νƒ€μž…μ„ μ œκ±°ν•œ 후에 νƒ€μž…μ΄ μΌμΉ˜ν•˜μ§€ μ•ŠμœΌλ©΄, ν˜•λ³€ν™˜μ„ μΆ”κ°€ν•œλ‹€.

μ™€μΌλ“œ μΉ΄λ“œκ°€ ν¬ν•¨λœ 경우, μ μ ˆν•œ νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜μ„ μΆ”κ°€ν•œλ‹€. 

 

 

5️⃣ μ—΄κ±°ν˜• Enum

μ—΄κ±°ν˜•μ€ μ„œλ‘œ κ΄€λ ¨λœ μƒμˆ˜λ₯Ό νŽΈλ¦¬ν•˜κ²Œ μ„ μ–Έν•˜κΈ° μœ„ν•œ κ²ƒμœΌλ‘œ μ—¬λŸ¬ μƒμˆ˜λ₯Ό μ •μ˜ν•  λ•Œ μ‚¬μš©ν•˜λ©΄ μœ μš©ν•˜λ‹€. 

-> μžλ°”μ˜ μ—΄κ±°ν˜•μ€ νƒ€μž…μ— μ•ˆμ „ν•œ μ—΄κ±°ν˜•μ΄λΌμ„œ μ‹€μ œ 값이 같아도 νƒ€μž…μ΄ λ‹€λ₯΄λ©΄ 컴파일 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€. 이처럼 κ°’ 뿐만 μ•„λ‹ˆλΌ νƒ€μž…κΉŒμ§€ μ²΄ν¬ν•˜κΈ° λ•Œλ¬Έμ— νƒ€μž…μ— μ•ˆμ „ν•˜λ‹€κ³  ν•œλ‹€!

 

 

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

enum μ—΄κ±°ν˜• 이름  { μƒμˆ˜λͺ…1, μƒμˆ˜λͺ…2 ...} 

이 μ—΄κ±°ν˜•μ— μ •μ˜λœ μƒμˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 방법은 μ—΄κ±°ν˜•μ΄λ¦„.μƒμˆ˜λͺ… 이닀. 

 

μ—΄κ±°ν˜• μƒμˆ˜κ°„μ˜ λΉ„κ΅μ—λŠ” == 을 μ‚¬μš©ν•  수 μžˆλ‹€. ( equalsκ°€ μ•„λ‹Œ ==둜 비ꡐ가 κ°€λŠ₯ν•˜λ‹€λŠ” 것은 그만큼 λΉ λ₯Έ μ„±λŠ₯을 μ œκ³΅ν•œλ‹€λŠ” μ–˜κΈ°μ΄λ‹€.)

κ·ΈλŸ¬λ‚˜ λΉ„κ΅μ—°μ‚°μžλŠ” μ‚¬μš©ν•  수 μ—†κ³ , compareTo()λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€, 

 

 

 

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

 

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

Enum ν΄λž˜μŠ€μ— μ •μ˜λœ ordinal()이 μ—΄κ±°ν˜• μƒμˆ˜κ°€ μ •μ˜λœ μˆœμ„œλ₯Ό λ°˜ν™˜ν•˜μ§€λ§Œ, 이 값을 μ—΄κ±°ν˜• μƒμˆ˜μ˜ κ°’μœΌλ‘œ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹λ‹€.

이 값은 내뢀적인 μš©λ„λ‘œλ§Œ μ‚¬μš©λ˜κΈ° μœ„ν•œ 것이기 λ•Œλ¬Έμ΄λ‹€. 

 

μ—΄κ±°ν˜• μƒμˆ˜μ˜ 값이 λΆˆμ—°μ†μ μΈ κ²½μš°μ—λŠ” μ—΄κ±°ν˜• μƒμˆ˜μ˜ 이름 μ˜†μ— μ›ν•˜λŠ” 값을 κ΄„ν˜Έμ™€ ν•¨κ»˜ 적어주면 λœλ‹€. 

그리고 μ§€μ •λœ 값을 μ €μž₯ν•  수 μžˆλŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ™€ μƒμ„±μžλ₯Ό μƒˆλ‘œ μΆ”κ°€ν•΄ μ£Όμ–΄μ•Ό ν•œλ‹€. 

μ΄λ•Œ μ—΄κ±°ν˜• μƒμ„±μžλŠ” Private 둜 μ™ΈλΆ€μ—μ„œ 객체 생성 λΆˆκ°€λŠ₯ν•˜λ‹€. 

 

 

6️⃣ μ• λ„ˆν…Œμ΄μ…˜ annotation

μ• λ‹ˆν…Œμ΄μ…˜μ΄λž€ μ£Όμ„μ²˜λŸΌ ν”„λ‘œκ·Έλž˜λ° 언어에 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠμœΌλ©° μœ μš©ν•œ 정보λ₯Ό μ œκ³΅ν•˜λŠ” 것이닀. 

 

μžλ°”λ₯Ό κ°œλ°œν•œ μ‚¬λžŒλ“€μ€ μ†ŒμŠ€μ½”λ“œμ— λŒ€ν•œ λ¬Έμ„œλ₯Ό λ”°λ‘œ λ§Œλ“€κΈ°λ³΄λ‹€ μ†ŒμŠ€μ½”λ“œμ™€ λ¬Έμ„œλ₯Ό ν•˜λ‚˜μ˜ 파일둜 κ΄€λ¦¬ν•˜λŠ” 것이 λ‚«λ‹€κ³  μƒκ°ν–ˆλ‹€.

κ·Έλž˜μ„œ μ†ŒμŠ€μ½”λ“œμ΄ 주석 /** ~ */ 에 μ†ŒμŠ€μ½”λ“œμ— λŒ€ν•œ 정보λ₯Ό μ €μž₯ν•˜κ³ , μ†ŒμŠ€μ½”λ“œμ˜ μ£Όμ„μœΌλ‘œλΆ€ν„° htmlλ¬Έμ„œλ₯Ό μƒμ„±ν•΄λ‚΄λŠ” ν”„λ‘œκ·Έλž¨ javadoc.exeλ₯Ό λ§Œλ“€μ–΄ μ‚¬μš©ν–ˆλ‹€. 

 

/** 둜 μ‹œμž‘ν•˜λŠ” 주석 μ•ˆμ— μ†ŒμŠ€μ½”λ“œμ— λŒ€ν•œ μ„€λͺ…듀이 있고 κ·Έ μ•ˆμ— '@'이 뢙은 νƒœκ·Έλ“€μ„ μ΄μš©ν•΄μ„œ 주석 μ•ˆμ— 정보λ₯Ό μ œκ³΅ν•˜κ³  javadoc.exeλΌλŠ” ν”„λ‘œκ·Έλž¨μ΄ 이 정보λ₯Ό μ½μ–΄μ„œ λ¬Έμ„œλ₯Ό μž‘μ„±ν•˜λŠ”λ° μ‚¬μš©ν•œλ‹€. 

 

이 κΈ°λŠ₯을 μ‘μš©ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ˜ μ†ŒμŠ€μ½”λ“œ μ•ˆμ— λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ„ μœ„ν•œ 정보λ₯Ό 미리 μ•½μ†λœ ν˜•μ‹μœΌλ‘œ ν¬ν•¨μ‹œν‚¨ 것이 λ°”λ‘œ μ• λ„ˆν…Œμ΄μ…˜μ΄λ‹€. 

μ• ν„°λ„€μ΄μ…˜μ΄ μ£Όμ„μ²˜λŸΌ ν”„λ‘œκ·Έλž˜λ° 언어에 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠμœΌλ©΄μ„œλ„ λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ—κ²Œ μœ μš©ν•œ 정보λ₯Ό μ œκ³΅ν•  수 μžˆλ‹€λŠ” μž₯점이 μžˆλ‹€. 

 

μžμ‹ μ΄ μž‘μ„±ν•œ μ†ŒμŠ€μ½”λ“œ μ€‘μ—μ„œ νŠΉμ • λ©”μ„œλ“œλ§Œ ν…ŒμŠ€νŠΈν•˜κΈ° μ›ν•œλ‹€λ©΄ @Test μ• λ„ˆν…Œμ΄μ…˜μ„ 뢙이면 λœλ‹€. 

@Test λŠ” ν…ŒμŠ€νŠΈ ν”„λ‘œκ·Έλž¨μ—κ²Œ μ•Œλ¦¬λŠ” 역할을 ν•  뿐, λ©”μ„œλ“œκ°€ ν¬ν•¨λœ ν”„λ‘œκ·Έλž¨ μžμ²΄μ—λŠ” μ•„λ¬΄λŸ° 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠλŠ”λ‹€.

μ£Όμ„μ²˜λŸΌ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” κ²ƒμ΄λ‚˜ 닀름없닀.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90