Language/JAVA

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

κ΅ λ―Ό 2024. 8. 28. 14:54

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

좜처 : μƒν™œμ½”λ”© tistiry

  • Person 클래슀λ₯Ό λ§Œλ“€ λ•Œ μ΄μš©ν•˜μ—¬ μ „μ—­λ³€μˆ˜ info의 λ°μ΄ν„°νƒ€μž…μ„ T둜 μΌμ‹œμ μœΌλ‘œ 지정해 μ€€λ‹€.
  • 이후 Person이 μΈμŠ€ν„΄μŠ€ν™”ν•  λ•Œ μ§€μ •ν•œ ꡬ체적인 데이터 νƒ€μž… (μ—¬κΈ°μ—μ„œλŠ” string)이 Tμžλ¦¬μ— λ“€μ–΄κ°€ λ³€μˆ˜ infoκ°€νƒ€μž…μ„ κ°–κ²Œ λœλ‹€.

*νŠΉμ§•*

1. μ œλ„€λ¦­μ˜ 이름은 μ„œλ‘œ 달라야 ν•œλ‹€. 보톡 T  뒀에 μœ„μΉ˜ν•œ μ•ŒνŒŒλ²³μ„ λŒ€λ¬Έμž ν˜•νƒœλ‘œ μ‚¬μš©ν•œλ‹€.

2. μ œλ„€λ¦­μ˜ μžλ£Œν˜•μ€ κΈ°λ³Έ 데이터 νƒ€μž… (int, char,...) 이 μ•„λ‹Œ μ°Έμ‘°ν˜• 데이터 νƒ€μž…λ§Œμ„ μ·¨κΈ‰ν•œλ‹€.

 

μ œλ„€λ¦­ ν”„λ‘œκ·Έλž˜λ° (generic programming) : λ‹€μ–‘ν•œ μ’…λ₯˜μ˜ 데이터λ₯Ό μ²˜λ¦¬ν•  수 μžˆλŠ” ν΄λž˜μŠ€μ™€ λ©”μ„œλ“œλ₯Ό μž‘μ„±ν•˜λŠ” 기법

  • μžλ£Œν˜•μ— λŒ€ν•œ 정보가 λ‹΄κ²¨μžˆλŠ” λ°•μŠ€λ₯Ό μ œκ³΅ν•΄ μ€€λ‹€.

 

 

μ œλ„€λ¦­μ˜ μ‚¬μš©μ΄μœ 

: ν•΄λ‹Ή μ½”λ“œλ₯Ό 보면, StudentPersonκ³Ό EmployeePerson이 νƒ€μž…λ§Œ λ‹€λ₯΄κ³  λ˜‘κ°™μ€ λ©”μ»€λ‹ˆμ¦˜μ„ 가진 것을 μ•Œ 수 있음.

  • 쀑볡 쑴재
  • → κ³΅ν†΅μ˜ 쑰상 Objectλ₯Ό μ‚¬μš©ν•˜μ—¬ StudentPersonκ³Ό EmployeePerson을 λŒ€ν‘œν•˜λŠ” 클래슀λ₯Ό λ§Œλ“€ 수 μžˆμ§€ μ•Šμ„κΉŒ? ν•˜λŠ” λ°œμƒμœΌλ‘œ μ‹œμž‘.

 

πŸ“„ κ³΅ν†΅μ˜ 쑰상 objectλ₯Ό μ‚¬μš©ν•œ μ½”λ“œ

: μ½”λ“œμ˜ 쀑볡을 μ œκ±°ν•˜κ³ μž info의 μžλ£Œν˜•μ„ Objectλ₯Ό μ‚¬μš©ν•˜μ—¬ 클래슀 ν•˜λ‚˜λ‘œ 묢을 수 μžˆμ—ˆμ§€λ§Œ, κ·Έλ‘œμΈν•΄ person μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 λ•Œ(16쀄) λ§€κ°œλ³€μˆ˜λ‘œ μ–΄λ– ν•œ μžλ£Œν˜•μ΄ 듀어와도 컴파일 였λ₯˜κ°€ λœ¨μ§€ μ•Šκ²Œ λ˜μ—ˆλ‹€.

λͺ¨λ“  νƒ€μž…μ΄ 올 수 있기 λ•Œλ¬Έμ— νƒ€μž…μ„ μ—„κ²©ν•˜κ²Œ μ œν•œν•  수 μ—†κ²Œ λ˜λŠ” 문제 λ°œμƒ.

νƒ€μž…μ΄ μ•ˆμ „ν•˜μ§€ μ•Šλ‹€.

 

β–Ά λŸ°νƒ€μž„ 였λ₯˜ λ°œμƒ. 

why? μžλ°”λŠ” 데이터 νƒ€μž…μ„ μ€‘μ‹œν•˜λŠ” μ–Έμ–΄λ‘œ, μ„€μ •ν•˜μ§€ μ•Šμ€ 값은 받아듀이지 μ•ŠλŠ”λ‹€.

 

μ œλ„€λ¦­ν™”

  • (쀄 6) Person μ•ˆμ˜ 데이터 ν•„λ“œμ˜ μžλ£Œν˜•μ„ ν™•μ • 짓고 싢지 μ•ŠκΈ°μ—, <> μ•ˆμ— μžλ£Œν˜•μ„ μΌμ‹œμ μœΌλ‘œ λͺ…μ‹œν•œ 것.
    • μœ„ μ˜ˆμ‹œμ™€ 같이 μ œλ„€λ¦­μ΄ 2개 이상 볡수둜 ν•„μš”ν•œ 경우 콀마λ₯Ό μ΄μš©ν•˜μ—¬ μžλ£Œν˜• ꡬ뢄
  • (쀄 13)

 

문제점

  • μ œλ„€λ¦­ μžλ£Œν˜•μ—μ„œ int(κΈ°λ³Έ 데이터 νƒ€μž…) μ‚¬μš©μœΌλ‘œ 인해 였λ₯˜ λ°œμƒ
    • wrapper 클래슀λ₯Ό μ‚¬μš©ν•˜μ—¬ κΈ°λ³Έ λ°μ΄ν„°νƒ€μž…μ„ 객체인 κ²ƒμ²˜λŸΌ μ·¨κΈ‰ν•  수 μžˆλ‹€.
      (int의 경우 Integer, double의 경우 Double 이런 μ‹μœΌλ‘œ 각각의 κΈ°λ³Έ 데이터 νƒ€μž…λ§ˆλ‹€ μ‘΄μž¬ν•˜λŠ” 래퍼클래슀λ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€)

 

πŸ“„ wrapper 클래슀λ₯Ό μ΄μš©ν•œ μ½”λ“œ 

  • (쀄 18) value λ©”μ„œλ“œμ˜ μ—­ν•  : 래퍼 ν΄λž˜μŠ€μ— 감싸진 데이터 νƒ€μž… 즉, κΈ°λ³Έ λ°μ΄ν„°νƒ€μž…μœΌλ‘œ λ³€ν™˜μ‹œμΌœ μ€€λ‹€.

 

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

  • μ ‘κ·Ό μ œμ–΄μžμ™€ λ°˜ν™˜ν˜• νƒ€μž… 사이에 <>λ₯Ό μ΄μš©ν•˜μ—¬ μΌμ‹œμ μœΌλ‘œ μ‚¬μš©ν•  μžλ£Œν˜•μ„ 지정해 μ£Όλ©΄,μ§€μ •λœ μžλ£Œν˜•μ΄ λ©”μ„œλ“œ λ§€κ°œλ³€μˆ˜μ˜ μžλ£Œν˜•μœΌλ‘œ μ‚¬μš©λœλ‹€.
  • λ©”μ„œλ“œμ—μ„œ λ˜ν•œ μžλ£Œν˜• 좔정이 κ°€λŠ₯ν•  λ•Œ μƒλž΅μ΄ κ°€λŠ₯ν•˜λ‹€.

 

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

: μ œλ„€λ¦­μ„ μ œν•œ 없이 μ‚¬μš©ν•  경우 λͺ¨λ“  μžλ£Œν˜• νƒ€μž…μ΄ μ‚¬μš©λ  수 μžˆλ‹€.

→ μ œν•œμ΄ μ—†λŠ” ν”„λ‘œκ·Έλž˜λ°μ€ 쒋은 ν”„λ‘œκ·Έλž¨μ΄ μ•„λ‹ˆλ‹€.

extends 상속을 μ΄μš©ν•˜μ—¬ λΆ€λͺ¨ ν΄λž˜μŠ€μ™€, λΆ€λͺ¨ν΄λž˜μŠ€μ˜ μžμ‹λ“€λ§Œμ΄ μžλ£Œν˜•μœΌλ‘œλ§Œ μ œν•œν•  수 μžˆλ‹€

 

 

λΆ€λͺ¨λ₯Ό 클래슀둜 λ§Œλ“€μ—ˆμ„ 경우 -> μžμ‹ μž…μž₯μ—μ„œ extends둜만 상속 κ°€λŠ₯.

λΆ€λͺ¨λ₯Ό μΈν„°νŽ˜μ΄μŠ€λ‘œ λ§Œλ“€μ—ˆμ„ 경우 -> μžμ‹ μž…μž₯μ—μ„œ extends, implements둜 상속 κ°€λŠ₯

 

μ΄λ•Œμ— Person ν΄λž˜μŠ€λŠ” Info μΈν„°νŽ˜μ΄μŠ€ μ•ˆμ˜ ν•˜μœ„ λ©”μ„œλ“œ getLevel μ‚¬μš© κ°€λŠ₯.

(λ§Œμ•½ Tκ°€ μƒμ†ν•˜λŠ” ν΄λž˜μŠ€κ°€ 없을 경우 Object 클래슀λ₯Ό μžλ°”μ—μ„œ μžλ™μœΌλ‘œ μƒμ†ν•˜κΈ°μ— getLevel λ©”μ„œλ“œ μ‚¬μš© λΆˆκ°€ν•¨.)