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

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

728x90

 

1️⃣ μ§€λ„€λ¦­μŠ€ Generics  

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

객체의 νƒ€μž…μ„ 컴파일 μ‹œμ— μ²΄ν¬ν•˜κΈ° λ•Œλ¬Έμ— 객체의 νƒ€μž… μ•ˆμ •μ„±μ„ 높이고 ν˜•λ³€ν™˜μ˜ λ²ˆκ±°λ‘œμ›€μ΄ 쀄어든닀. 

 

νƒ€μž…μ˜ μ•ˆμ •μ„±μ„ λ†’μΈλ‹€λŠ” 것은 μ˜λ„ν•˜μ§€ μ•Šμ€ νƒ€μž…μ˜ 객체가 μ €μž₯λ˜λŠ” 것을 막고 μ €μž₯된 객체λ₯Ό κΊΌλ‚΄μ˜¬ λ•Œ μ›λž˜μ˜ νƒ€μž…κ³Ό λ‹€λ₯Έ νƒ€μž…μœΌλ‘œ 잘λͺ» ν˜•λ³€ν™˜λ˜μ–΄ λ°œμƒν•  수 μžˆλŠ” 였λ₯˜λ₯Ό 쀄여쀀닀. 

 

ex) Arraylist와 같은 μ»¬λ ‰μ…˜ ν΄λž˜μŠ€λŠ” λ‹€μ–‘ν•œ μ’…λ₯˜μ˜ 객체듀을 담을 수 μžˆκΈ°λŠ” ν•˜μ§€λ§Œ 보톡 ν•œ μ’…λ₯˜μ˜ 객체λ₯Ό λ‹΄λŠ” κ²½μš°κ°€ 더 λ§Žλ‹€. 

κ·ΈλŸ°λ°λ„ κΊΌλ‚Ό λ•Œ λ§ˆλ‹€ νƒ€μž… 체크λ₯Ό ν•˜κ³  ν˜•λ³€ν™˜ν•˜λŠ” 것은 μ•„λ¬΄λž˜λ„ λΆˆνŽΈν•  μˆ˜λ°–μ— μ—†λ‹€. 

κ²Œλ‹€κ°€ μ›ν•˜μ§€ μ•ŠλŠ” μ’…λ₯˜μ˜ 객체가 ν¬ν•¨λ˜λŠ” 것을 막을 방법이 μ—†λ‹€λŠ” 것도 λ¬Έμ œλ‹€! 

-> 이런 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 것이 μ§€λ„€λ¦­μŠ€μ΄λ‹€. 

 

μ§€λ„€λ¦­μŠ€μ˜ μž₯점
- νƒ€μž… μ•ˆμ •μ„±μ„ μ œκ³΅ν•œλ‹€. 
- νƒ€μž…μ²΄ν¬μ™€ ν˜•λ³€ν™˜μ„ μƒλž΅ν•  수 μžˆμœΌλ―€λ‘œ μ½”λ“œκ°€ κ°„κ²°ν•΄ 진닀. 

κ°„λ‹¨ν•˜κ²ŒλŠ” μ§€λ„€λ¦­μŠ€λŠ” λ‹€λ£° 객체의 νƒ€μž…μ„ 미리 λͺ…μ‹œν•΄μ„œ 번거둜운 ν˜•λ³€ν™˜μ„ 쀄여쀀닀!!

 

 

2️⃣ 지넀릭 클래슀의 μ„ μ–Έ 

지넀릭 νƒ€μž…μ€ ν΄λž˜μŠ€μ™€ λ©”μ„œλ“œμ— μ„ μ–Έν•  수 μžˆλ‹€. 

클래슀λ₯Ό 지넀릭 클래슀둜 λ³€κ²½ν•œλ‹€λ©΄ 클래슀 μ•žμ— <T>λ₯Ό 뢙이면 λœλ‹€!

Box<T>μ—μ„œ Tλ₯Ό νƒ€μž… λ³€μˆ˜λΌκ³  ν•˜κ³ , Type의 Tλ₯Ό λ”°μ˜¨ κ±°λ‹€. T λŒ€μ‹  λ‹€λ₯Έ 문자λ₯Ό μ‚¬μš©ν•΄λ„ 상관은 μ—†λ‹€.

Arraylist<E>의 κ²½μš°μ— EλŠ” Element의 E이닀. 

νƒ€μž… λ³€μˆ˜κ°€ μ—¬λŸ¬κ°œμΈ κ²½μš°μ—λŠ” Map<K, V> μ—μ„œ KλŠ” Key , VλŠ” Valueλ₯Ό μ˜λ―Έν•œλ‹€. 

-> 이건 기호의 μ’…λ₯˜λ§Œ λ‹€λ₯Ό 뿐이고 μž„μ˜μ˜ μ°Έμ‘°ν˜• νƒ€μž…μ„ μ˜λ―Έν•œλ‹€λŠ” 것은 λ™μΌν•˜λ‹€. 

 

그리고 지넀릭 ν΄λž˜μŠ€κ°€ 된 Box클래슀의 객체λ₯Ό 생성할 λ•ŒλŠ” μ°Έμ‘°λ³€μˆ˜μ™€ μƒμ„±μžμ— νƒ€μž… T λŒ€μ‹ μ— μ‚¬μš©λ  μ‹€μ œ νƒ€μž…μ„ 지정해주어야 ν•œλ‹€. 

 

 

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

 

 

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

μ§€λ„€λ¦­μŠ€ 클래슀 Box의 객체λ₯Ό 생성할 λ•Œ, κ°μ²΄λ³„λ‘œ λ‹€λ₯Έ νƒ€μž…μ„ μ§€μ •ν•˜λŠ” 것은 μ μ ˆν•˜λ‹€! (μ›λž˜ 그러렀고 λ§Œλ“  κΈ°λŠ₯μ΄λ‹ˆκΉŒ) 

1. λͺ¨λ“  객체에 λŒ€ν•΄ λ™μΌν•˜κ²Œ λ™μž‘ν•΄μ•Όν•˜λŠ” static 멀버에 νƒ€μž…  λ³€μˆ˜ Tλ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€.
2. 지넀릭 νƒ€μž…μ˜ 배열을 μƒμ„±ν•˜λŠ” 것도 ν—ˆμš©λ˜μ§€ μ•ŠλŠ”λ‹€. 

-> staticλ©€λ²„λŠ” νƒ€μž… λ³€μˆ™μ— μ§€μ •λœ νƒ€μž…, 즉 λŒ€μž…λœ νƒ€μž…μ˜ μ’…λ₯˜μ— 관계없이 λ™μΌν•œ 것이어야 ν•˜κΈ° λ•Œλ¬Έμ— static λ©€λ²„μ—λŠ” νƒ€μž… λ³€μˆ˜λ₯΄ 지정할 수 μ—†λ‹€. 즉 Box<Apple>.itemκ³Ό Box<Grape>.item이 λ‹€λ₯Έ 것이면 μ•ˆλœλ‹€λŠ” λœ»μ΄λ‹€!!

 

-> 지넀릭 배열을 생성할 수 μ—†λŠ” 것은 new μ—°μ‚°μž λ•Œλ¬ΈμΈλ° 이 μ—°μ‚°μžλŠ” 컴파일 μ‹œμ μ— Tκ°€ 무엇인지 μ •ν™•ν•˜κ²Œ μ•Œμ•„μ•Ό ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€!!!

 

 

 

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

 

1. Box<T>의 객체λ₯Ό 생성할 λ•Œ μ°Έμ‘°λ³€μˆ˜μ™€ μƒμ„±μžμ— λŒ€μž…λœ νƒ€μž…μ΄ μΌμΉ˜ν•΄μ•Όν•œλ‹€. 

-> 두 νƒ€μž…μ΄ 상속 관계에 μžˆλ‹€κ³  해도 λŒ€μž…λœ νƒ€μž…μ΄ λ‹€λ₯΄λ©΄ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

 

2. 두 지넀릭 클래슀의 νƒ€μž…μ΄ 상속관계이고, λŒ€μž…λœ νƒ€μž…μ΄ μΌμΉ˜ν•˜λŠ” 것은 κ°€λŠ₯ν•˜λ‹€. 

그리고 jdk1.7λΆ€ν„°λŠ” 좔정이 κ°€λŠ₯ν•œ 경우 νƒ€μž…μ„ μƒλž΅ν•  수 있게 λœλ‹€. μ°Έμ‘°λ³€μˆ˜μ˜ νƒ€μž…μœΌλ‘œλΆ€ν„° Boxκ°€ Appleνƒ€μž…μ˜ 객체만 μ €μž₯ν•œλ‹€λŠ” 것을 μ•Œμˆ˜ 있기 λ•Œλ¬Έμ— μƒμ„±μžμ— λ°˜λ³΅ν•΄μ„œ νƒ€μž…μ„ 지정해주지 μ•Šμ•„λ„ λœλ‹€.

 

3. λŒ€μž…λœ νƒ€μž…κ³Ό λ‹€λ₯Έ νƒ€μž…μ˜ κ°μ²΄λŠ” μΆ”κ°€ν•  수 μ—†λ‹€.

 

 

 

4️⃣ μ œν•œλœ 지넀릭 클래슀 

νƒ€μž… λ§€κ°œλ³€μˆ˜ T에 지정할 수 μžˆλŠ” νƒ€μž…μ˜ μ’…λ₯˜λ₯Ό μ œν•œν•˜κΈ° μœ„ν•΄μ„œλŠ” extends ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ νŠΉμ • νƒ€μž…μ˜ μžμ†λ“€λ§Œ λŒ€μž…ν•  수 있제 μ œν•œν•  수 μžˆλ‹€. 

-> μ΄λ•Œ ν΄λž˜μŠ€κ°€ μ•„λ‹ˆλΌ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•΄μ•Όν•œλ‹€λŠ” μ œμ•½μ΄ ν•„μš”ν•˜λ‹€λ©΄ implementsκ°€ μ•„λ‹Œ extendsλ₯Ό μ‚¬μš©ν•œλ‹€.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90