λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ’Ž/Java

[Java] μ œλ„€λ¦­(Generic)

by dar0m! 2021. 7. 28.

κ°œλ…

클래슀 λ‚΄λΆ€μ—μ„œ μ‚¬μš©ν•  데이터 νƒ€μž…μ„ μ™ΈλΆ€μ—μ„œ μ§€μ •ν•˜λŠ” 기법이닀.

 

μ™œ ν•„μš”ν• κΉŒ?

1. μ€‘λ³΅λ˜λŠ” μ†ŒμŠ€λ₯Ό ν•˜λ‚˜λ‘œ λ¬Άμ–΄ μ†ŒμŠ€μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±μ„ κ·ΉλŒ€ν™” ν•˜κΈ° μœ„ν•΄μ„œ
데이터 νƒ€μž…λ³„λ‘œ 클래슀λ₯Ό 생성할 ν•„μš” 없이 ν•˜λ‚˜μ˜ ν΄λž˜μŠ€μ—μ„œ 데이터 νƒ€μž…λ§Œ λ°”κΏ” μ‘°λ¦½ν•˜λ“― μ½”λ“œ μž¬ν™œμš©μ΄ κ°€λŠ₯ν•˜λ‹€. 

2. 객체 μƒμ„±μ‹œ μ‚¬μš©ν•˜λ €κ³  ν•˜λŠ” λ°μ΄ν„°νƒ€μž…μ— λŒ€ν•œ μ œν•œμ„ 쀄 수 μžˆλ‹€.
효과 → 컴파일 νƒ€μž„μ— νƒ€μž… 체크λ₯Ό ν•˜κΈ° μœ„ν•¨μ΄λ‚˜ νƒ€μž… μΊμŠ€νŒ…(ν˜•λ³€ν™˜)을 μ œκ±°ν•˜μ—¬ ν”„λ‘œκ·Έλž¨ μ„±λŠ₯ ν–₯상
       → ν˜•λ³€ν™˜μ΄ ν•„μš”μ—†κ³ , νƒ€μž…μ•ˆμ •μ„±μ΄ 보μž₯λœλ‹€.

  • extends T(μƒν•œ 경계), ? super T(ν•˜ν•œ 경계), ?(μ™€μΌλ“œ μΉ΄λ“œ)


데이터 νƒ€μž…μ„ μ œν•œν•˜κ²Œ 되면 얻을 수 μžˆλŠ” 이점은 상속 κ΄€κ³„μ—μ„œ μžˆλ‹€.

상속 κ΄€κ³„μ—μ„œ μžμ‹μ€ λΆ€λͺ¨μ˜ λͺ¨λ“  것을 κ°€μ Έλ‹€ μ‚¬μš©ν•  수 μžˆλ‹€. κ·Έλ ‡κ²Œ λ•Œλ¬Έμ— λ¬΄ν„±λŒ€κ³  <T> 라고 μž‘μ„±ν•˜μ—¬ 아무 λ°μ΄ν„°νƒ€μž…μ„ ν—ˆμš©ν•œλ‹€λ©΄ μ»΄νŒŒμΌμ‹œ μ•„λ¬΄λŸ° 였λ₯˜κ°€ κ²€μΆœλ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ‚¬μš©μžλŠ” λ¬Έμ œκ°€ μ—†λ‹€κ³  νŒλ‹¨ν•  수 μžˆμ§€λ§Œ λŸ°νƒ€μž„μ‹œ μ˜ˆμ™Έκ°€ λ°œμƒν•  수 μžˆλ‹€. 이런 경우λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ 데이터 νƒ€μž…μ„ μ œν•œν•˜λŠ” 것이 ν•„μš”ν•˜λ‹€.

 

java μ œλ„€λ¦­ (Generic), λ‚΄κ°€ μ•Œμ•„λ³΄κΈ° μ‰½κ²Œ 정리 - 2편, μ–΄λ–»κ²Œ μ œλ„€λ¦­

이전에 μ™œ μ œλ„€λ¦­μ΄ λ‚˜μ™”λŠ”μ§€ μ•Œμ•˜λ‹€λ©΄, (java μ œλ„€λ¦­ (Generic), λ‚΄κ°€ μ•Œμ•„λ³΄κΈ° μ‰½κ²Œ 정리 - 1편, μ™œ μ œλ„€λ¦­) μ΄λ²ˆμ—λŠ” 기본적인 μ œλ„€λ¦­ μ‚¬μš© 방법에 λŒ€ν•΄ 정리λ₯Ό 해보렀 ν•œλ‹€. μš°μ„  <> 이 닀이아λͺ¬λ“œ

xxxelppa.tistory.com

 

μ œλ„€λ¦­μ„ μ‚¬μš©ν•  수 μ—†λŠ” 경우

  1. λ°°μ—΄ 생성
    new μ—°μ‚°μžλŠ” heap μ˜μ—­μ— μΆ©λΆ„ν•œ 곡간이 μžˆλŠ”μ§€ 확인 ν›„ λ©”λͺ¨λ¦¬λ₯Ό ν™•λ³΄ν•˜λŠ” 역할을 ν•˜λŠ”λ°, 컴파일 μ‹œμ μ— νƒ€μž… Tκ°€ 무엇인지 μ•Œ 수 μ—†κΈ° λ•Œλ¬Έμ— μ œλ„€λ¦­μœΌλ‘œ 배열을 생성할 수 μ—†λ‹€.
    → ex) Object νƒ€μž…μœΌλ‘œ μ„ μ–Έν•˜κ³  get() ν˜ΈμΆœμ‹œ T νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜ 함
  2. static λ³€μˆ˜
    static λ³€μˆ˜λŠ” μΈμŠ€ν„΄μŠ€μ— μ’…μ†λ˜μ§€ μ•Šμ€ 클래슀 λ³€μˆ˜λ‘œμ¨ λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ κ³΅ν†΅λœ μ €μž₯곡간을 κ³΅μœ ν•˜κ²Œ λœλ‹€.
    ν•˜λ‚˜μ˜ κ³΅μœ λ³€μˆ˜κ°€, μƒμ„±λ˜λŠ” μΈμŠ€ν„΄μŠ€μ— 따라 νƒ€μž…μ΄ λ°”λ€λ‹€λŠ” κ°œλ… μžμ²΄κ°€ 말이 μ•ˆλ¨. λ”°λΌμ„œ static λ³€μˆ˜μ—λŠ” μ œλ„€λ¦­μ„ μ‚¬μš©ν•  수 μ—†λ‹€.

    ν•˜μ§€λ§Œ, static λ©”μ„œλ“œμ—μ„œλŠ” μ œλ„€λ¦­μ„ μ‚¬μš©ν•  수 μžˆλ‹€.

 

μ œλ„€λ¦­ λ©”μ„œλ“œ

λ¦¬ν„΄νƒ€μž…μ΄ 무엇인지 상관없이 λ‚΄κ°€ μ œλ„€λ¦­ λ©”μ„œλ“œλΌλŠ” 것을 μ»΄νŒŒμΌλŸ¬μ—κ²Œ μ•Œλ €μ€˜μ•Ό ν•œλ‹€. λ¦¬ν„΄νƒ€μž…μ„ μ •μ˜ν•˜κΈ° 전에 μ œλ„€λ¦­ νƒ€μž…μ— λŒ€ν•œ μ •μ˜(리턴 νƒ€μž… μ•žμ— <T>)λ₯Ό λ°˜λ“œμ‹œ 적어야 ν•œλ‹€.

일반 클래슀 내뢀에도 μ œλ„€λ¦­ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•  수 μžˆλ‹€.
ν΄λž˜μŠ€μ— μ§€μ •λœ νƒ€μž… νŒŒλΌλ―Έν„°μ™€ μ œλ„€λ¦­ λ©”μ„œλ“œμ— μ •μ˜λœ νƒ€μž… νŒŒλΌλ―Έν„°λŠ” 상관이 μ—†λ‹€. 즉, μ œλ„€λ¦­ ν΄λž˜μŠ€μ— <T> λ₯Ό μ‚¬μš©ν•˜κ³ , 같은 클래슀의 μ œλ„€λ¦­ λ©”μ„œλ“œμ—λ„ <T> 둜 같은 이름을 가진 νƒ€μž…νŒŒλΌλ―Έν„°λ₯Ό μ‚¬μš©ν•˜λ”λΌλ„ λ‘˜μ€ μ „ν˜€ 상관이 μ—†λ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.

 

static λ©”μ„œλ“œ with μ œλ„€λ¦­

static λ³€μˆ˜μ˜ κ²½μš°μ— μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜λ©΄ μ—¬λŸ¬ μΈμŠ€ν„΄μŠ€μ—μ„œ μ–΄λ–€ νƒ€μž…μœΌλ‘œ κ³΅μœ λ˜μ–΄μ•Ό 할지 지정할 μˆ˜κ°€ μ—†μ–΄μ„œ μ‚¬μš©ν•  수 μ—†λ‹€. static λ³€μˆ˜λŠ” κ°’ μžμ²΄κ°€ 곡유되기 λ•Œλ¬Έμ΄λ‹€. κ°’ μžμ²΄κ°€ 곡유되렀면 νƒ€μž…μ— λŒ€ν•œ 정보도 μžˆμ–΄μ•Ό ν•œλ‹€.

ν•˜μ§€λ§Œ, static λ©”μ„œλ“œμ˜ 경우 λ©”μ„œλ“œμ˜ ν‹€λ§Œ κ³΅μœ λœλ‹€κ³  μƒκ°ν•˜λ©΄ λœλ‹€. 그리고 κ·Έ ν‹€ μ•ˆμ—μ„œ μ§€μ—­λ³€μˆ˜μ²˜λŸΌ νƒ€μž… νŒŒλΌλ―Έν„°κ°€ λ‹€μ–‘ν•˜κ²Œ μ˜€κ°€λŠ” ν˜•νƒœλ‘œ μ‚¬μš©λ  수 μžˆλŠ” 것이닀.

μ΄λŠ” static λ©”μ„œλ“œκ°€ μ•„λ‹Œ μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ˜ κ²½μš°μ—λ„ λ§ˆμ°¬κ°€μ§€λ‹€. ν΄λž˜μŠ€μ— μ •μ˜λœ νƒ€μž… νŒŒλΌλ―Έν„°μ™€λŠ” μ „ν˜€ λ³„κ°œλ‘œ μ œλ„€λ¦­ λ©”μ„œλ“œλŠ” μžμ‹ λ§Œμ˜ νƒ€μž…νŒŒλΌλ―Έν„°λ₯Ό 가진닀.

 

μ°Έκ³ 

λŒ“κΈ€