[μ΄νŽ™ν‹°λΈŒ μžλ°”] Item01 μ™„λ²½κ³΅λž΅. λ¦¬ν”Œλ ‰μ…˜ reflection

2023. 1. 4. 11:59ㆍJAVA/Effective JAVA

728x90

 

item01. μƒμ„±μž λŒ€μ‹  정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œλ₯Ό κ³ λ €ν•˜λΌ. 

" p.12 μ„œλΉ„μŠ€ 제곡자 μΈν„°νŽ˜μ΄μŠ€κ°€ μ—†λ‹€λ©΄ 각 κ΅¬ν˜„μ²΄λ₯Ό μΈμŠ€ν„΄μŠ€λ‘œ λ§Œλ“€ λ•Œ λ¦¬ν”Œλ ‰μ…˜μ„ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. "

 

 

λ¦¬ν”Œλ ‰μ…˜ μ΄λž€? 

: ν΄λž˜μŠ€λ‘œλ”λ₯Ό 톡해 μ½μ–΄μ˜¨ 클래슀 정보λ₯Ό μ‚¬μš©ν•˜λŠ” 기술 

λ¦¬ν”Œλ ‰μ…˜μ€ νž™ μ˜μ—­μ— λ‘œλ“œλœ class νƒ€μž…μ˜ 객체λ₯Ό 톡해 μ›ν•˜λŠ” 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μžˆλ„λ‘ μ§€μ›ν•˜κ³ , μΈμŠ€ν„΄μŠ€μ˜ ν•„λ“œμ™€ λ©”μ†Œλ“œλ₯Ό μ ‘κ·Ό μ œμ–΄μžμ™€ 상관없이 μ‚¬μš©ν•  수 μžˆλ„λ‘ μ§€μ›ν•˜λŠ” api 이닀. 

ꡬ체적인 클래슀 νƒ€μž…μ„ μ•Œμ§€ λͺ»ν•΄λ„, κ·Έ 클래슀의 λ©”μ†Œλ“œ, νƒ€μž…, λ³€μˆ˜λ“€μ— μ ‘κ·Όν•  수 μžˆλ„λ‘ ν•΄μ£ΌλŠ” μžλ°” API 이닀. 

 

λŸ°νƒ€μž„μ— μ§€κΈˆ μ‹€ν–‰λ˜κ³  μžˆλŠ” 클래슀λ₯Ό κ°€μ Έμ™€μ„œ μ‹€ν–‰ν•΄μ•Ό ν•˜λŠ” κ²½μš°λ‚˜ λ™μ μœΌλ‘œ 객체λ₯Ό μƒμ„±ν•˜κ³  λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•΄μ•Ό ν•˜λŠ” κ²½μš°μ— μžλ°” ν”Όλ₯Όλ ‰μ…˜ κΈ°μˆ μ„ μ΄μš©ν•˜λ©΄ 클래슀, μΈν„°νŽ˜μ΄μŠ€, λ©”μ†Œλ“œλ“€μ„ 찾을 수 있고, 객체λ₯Ό μƒμ„±ν•˜κ±°λ‚˜ λ³€μˆ˜λ₯Ό λ³€κ²½ν•˜κ±°λ‚˜ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•  수 μžˆλ‹€. 

 

 

ex) μŠ€ν”„λ§μ˜ μ–΄λ…Έν…Œμ΄μ…˜ κΈ°λŠ₯ 등이 λ¦¬ν”Œλ ‰μ…˜μ„ μ΄μš©ν•œ κΈ°λŠ₯이닀. 

 

HelloServiceλΌλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ EnglishServiceλΌλŠ” 클래슀λ₯Ό μƒμ„±ν•˜κ³ , λ¦¬ν”Œλ ‰μ…˜μ„ μ‚¬μš©ν•œ μ˜ˆμ œμ΄λ‹€. 

 

getConstructor() λ₯Ό 톡해 μƒμ„±μžλ₯Ό μ–»μ–΄μ˜€κ³ , newInstance() λ₯Ό 톡해 HelloService μΈμŠ€ν„΄μŠ€λ₯Ό λ™μ μœΌλ‘œ 생성해쀄 수 μžˆλ‹€. 

그리고 μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€μ˜ ν•„λ“œμ™€ λ©”μ†Œλ“œλ₯Ό μ ‘κ·Ό μ œμ–΄μžμ™€ 상관없이 μ‚¬μš©ν•  수 μžˆλ‹€. 

 

 

λ¦¬ν”Œλ ‰μ…˜ μž₯단점  

- μž₯점 

: λŸ°νƒ€μž„ μ‹œμ μ—μ„œ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³ , μ ‘κ·Ό μ œμ–΄μžμ™€ 관계없이 ν•„λ“œμ™€ λ©”μ†Œλ“œμ— μ ‘κ·Όν•˜μ—¬ ν•„μš”ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλŠ” μœ μ—°μ„±μ„ μ œκ³΅ν•΄μ€€λ‹€. 

 

- 단점 

: λŸ°νƒ€μž„ μ‹œμ μ— μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κΈ° λ•Œλ¬Έμ— 컴파일 μ‹œμ μ— ν•΄λ‹Ή νƒ€μž… 체크λ₯Ό ν•  수 μ—†λ‹€. 

λŸ°νƒ€μž„ μ‹œμ μ— μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κΈ° λ•Œλ¬Έμ— ꡬ체적인 λ™μž‘ 흐름을 νŒŒμ•…ν•˜κΈ° μ–΄λ ΅λ‹€. 

 

 

λ¦¬ν”Œλ ‰μ…˜λŠ” μ–Έμ œ μ‚¬μš©ν•˜λŠ”κ°€? 

- νŠΉμ • μ• λ…Έν…Œμ΄μ…˜μ΄ λΆ™μ–΄μžˆλŠ” ν•„λ“œ λ˜λŠ” λ©”μ†Œλ“œ μ½μ–΄μ˜€κΈ° (Junit, Spring)
- νŠΉμ • 이름 νŒ¨ν„΄μ— ν•΄λ‹Ήν•˜λŠ” λ©”μ†Œλ“œ λͺ©λ‘ 가져와 ν˜ΈμΆœν•˜κΈ° (getter,setter) 
- IDE μ—μ„œ μ •μ˜λœ λ©”μ„œλ“œλ₯Ό κ°€μ Έμ˜€κ±°λ‚˜ ν•  λ•Œ 

규λͺ¨κ°€ μž‘μ€ ν”„λ‘œμ νŠΈλΌλ©΄ κ°œλ°œμžκ°€ μΆ©λΆ„νžˆ 컴파일 μ‹œμ μ— ν”„λ‘œκ·Έλž¨μ—μ„œ μ‚¬μš©ν•˜λŠ” 객체와 μ˜μ‘΄κ΄€κ³„λ₯Ό λͺ¨λ‘ νŒŒμ•…ν•˜λŠ” 것이 κ°€λŠ₯ν•˜μ§€λ§Œ, 

ν”„λ ˆμž„μ›Œν¬μ™€ 같이 규λͺ¨κ°€ ꡉμž₯히 큰 ν”„λ‘œμ νŠΈμ— λŒ€ν•΄μ„œλŠ” μˆ˜λ§Žμ€ 객체와 이 μ˜μ‘΄κ΄€κ³„λ₯Ό λͺ¨λ‘ νŒŒμ•…ν•˜λŠ” 것은 μ–΄λ ΅λ‹€. 

λ”°λΌμ„œ μ΄λ•Œ λ¦¬ν”Œλ ‰μ…˜μ„ μ‚¬μš©ν•˜λ©΄ λ™μ μœΌλ‘œ 클래슀λ₯Ό λ§Œλ“€μ–΄μ„œ μ˜μ‘΄κ΄€κ³„λ₯Ό 맺어쀄 수 μžˆλ‹€. 

 

spring Bean Factoryμ—μ„œ @Controller, @Service, @Repository λ“±μ˜ μ–΄λ…Έν…Œμ΄μ…˜μ„ 뢙이면 Bean Factoryμ—μ„œ μ•Œμ•„μ„œ ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜μ΄ 뢙은 클래슀λ₯Ό μƒμ„±ν•˜κ³  κ΄€λ¦¬ν•΄μ£ΌλŠ”λ°, 생각해보면 Bean Factory에 ν•΄λ‹Ή ν΄λž˜μŠ€μ— λŒ€ν•΄μ„œ μ •μ˜ν•œ 적이 μ—†λŠ”λ° μ•Œμ•„μ„œ 관리해쀄 수 μžˆλŠ” μ΄μœ κ°€ λ¦¬ν”Œλ ‰μ…˜ 덕뢄이닀. 

 

λŸ°νƒ€μž„ μ‹œμ μ— μ–΄λ…Έν…Œμ΄μ…˜μ΄ 뢙은 클래슀λ₯Ό νƒμƒ‰ν•˜κ³  λ°œκ²¬ν•˜λ©΄ λ¦¬ν”Œλ ‰μ…˜μ„ν†΅ν•΄ ν•΄λ‹Ή 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  ν•„μš”ν•œ ν•„λ“œλ₯Ό μ£Όμž…ν•˜μ—¬ Bean Factory에 μ €μž₯ν•˜λŠ” μ‹μœΌλ‘œ μ‚¬μš©λœλ‹€. 

 

 

 

 

 

 

 

 

 

 

728x90