2022. 3. 11. 17:36ใ๊ฐ๋ ์ ๋ฆฌ ์์ ์ค/Java
๐ ๋ฆฌํ๋ ์ (Reflection) ์ฌ์ฉ
๋ฆฌํ๋ ์
์ ๊ตฌ์ฒด์ ์ธ ํด๋์ค ํ์
์ ์์ง ๋ชปํด๋, ๊ทธ ํด๋์ค์ ๋ฉ์๋, ํ์
, ๋ณ์๋ค์ ์ ๊ทผํ ์ ์๋๋ก ํด์ฃผ๋ ์๋ฐ API์ธ ๊ฒ์ด์์.
๊ทธ๋ ๋ค๋ฉด ๊ตฌ์ฒด์ ์ธ ํด๋์ค ํ์
์ ์์ง ๋ชปํ๋ค๋ผ๋ ์๋ฏธ๋ ๋ฌด์์ธ ๊ฒ์ผ๊น์? ๊ทธ๋ฆฌ๊ณ ๊ตฌ์ฒด์ ์ธ ํด๋์ค ํ์
์ ์์ง ๋ชปํ๋ฉด ๊ทธ ํด๋์ค์ ๋ฉ์๋, ํ์
, ๋ณ์๋ค์ ์ ๊ทผํ ์ ์๋ ๊ฒ ์ผ๊น์?
์์ ์ฌ์ง๊ณผ ๊ฐ์ด VO๋ฅผ ๋ชจ๋ Class์ ์กฐ์ Class์ธ Object๋ก ๋ด์ ์๋ ์์ง๋ง, ์ฐ๋ฆฌ๊ฐ ์ด์ฉํ ์ ์๋ Class๋ Object๊ฐ ์ ๊ณตํ๋ Class ๋ฐ์ ์๋ ๊ฒ์ด์์. ์ด ๋ด์ฉ์ Java์ ๋คํ์ฑ๊ณผ ๊ด๋ จ์ด ๊น์ ๋ด์ฉ์ธ ๊ฒ์ด์์. ์ด๋ ๊ฒ ๊ฐ์ฒด์ ๊ตฌ์ฒด์ ์ธ Class๋ฅผ ์์ง ๋ชปํ๋ค๋ฉด Class์ Method์ ๋ณ์๋ฅผ ์ด์ฉํ ์ ์๋ ๊ฒ์ด์์.
์ด๋ ๊ฒ Object๋ฅผ ํ๋ณํ์ ํด์ ์ด์ฉํ๋ค๊ณ ํ๋ฉด ํด๋น ๊ฐ์ฒด์ Method ๋ฑ์ ์ด์ฉํ ์ ์๋ ๊ฒ์ด์์.
๊ทธ๋ ๋ค๋ฉด ํ๊ฐ์ง ์๋ฌธ์ด ๋๋ ๊ฒ์ด์์. ๋ด๊ฐ ๊ฐ๋ฐ ํด ๋๊ณ , ์ฌ์ฉํ Class name, Type์ ๋ชจ๋ฅผ ์๊ฐ ์์๊น์?
JDBC๋ก ์๋ฅผ ๋ค์๋ฉด JVM์ด ๋์์ ์์ํ๊ณ , Code๊ฐ ์คํ ๋๊ธฐ ์ ๊น์ง ์ด๋ค JDBC Driver๊ฐ ์ฌ์ฉ๋ ์ง ์ ์๊ฐ ์๋ ๊ฒ์ด์์. JAVA๋ง ์ด์ฉํด์ DB์ ์ ๊ทผํ๋ ค๊ณ ํ ๋, ํญ์ ๋ณด์ด๋ Code ๋ณด์ ์ ์์ผ์ค๊น์?
๋ฐ๋ก `Class.forName("oracle.jdbc.driver.OracleDriver");` ์ด๊ฒ์ ์ด์ฉํ์ฌ Run Time ์ ๋์ ์ผ๋ก Class์ ๋ก๋ฉํ๊ฒ ๋๋ ๊ฒ์ด์์.
์ด๊ฒ ๊ฐ๋ฅํ ์ด์ ๋ JAVA Class File์ Byte Code๋ก Compile ๋์ด static ์์ญ์ ์์นํ๋๊ฒ ๋๋ ๊ฒ์ด์์. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ Class Name๋ง ์๊ณ ์์ผ๋ฉด ์ธ์ ๋ ์ด ์์ญ์ ์ ๊ทผํ์ฌ Class์ ๋ํ ์ ๋ณด๋ฅผ ์ป์ ์ ์๋ต๋๋ค!
Reflection์ ์คํ์ค์ธ ์๋ฐ ํ๋ก๊ทธ๋จ ๋ด๋ถ๋ฅผ ๊ฒ์ฌํ๊ณ , ๋ด๋ถ์ ์์ฑ์ ์์ ํ ์ ์๋ ๊ฒ์ด์์. reflection์ด ๊ตฌ์ฒด์ ์ผ๋ก ์ฐ์ด๋ ๊ณณ์ด Builder Tool์ ์ด์ฉํด์ ์ํํธ์จ์ด Component๋ฅผ ๋ง๋๋ ๊ฒ์ด๋๋๋ค. Tool์ reflection์ ์ด์ฉํ์ฌ ๋์ ์ผ๋ก Loading๋๋ JAVA Component(Class)์ ์์ฑ์ ๊ฐ์ ธ ์ฌ ์ ์๋ ๊ฒ์ด์์.
๋ํ Project Run Time์ Class ๊ตฌ์กฐ๋ฅผ Coding์ผ๋ก ํ์
์ด ๊ฐ๋ฅํ๋ ์๋ Mapping ํด์ฃผ๋ ๊ธฐ๋ฅ๋ค์ ๋ชจ๋ Reflection์ ์ฌ์ฉํ๊ณ ์๋ค๊ณ ๋ณด๋ฉด ๋๋ ๊ฒ์ด์์. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ๋ฉด์์ ์ขใ
์ง ์๊ณ , ๋จ๋ฐ ์์ ๋๋ฒ๊น
์ด๋, ๊ฐ๋
์ฑ์์ ๊ทน์
์ ํ๊ฒฝ์ ๋ง๋๋ ๊ฒ์ด์์. ์ค์ ๋ก Spring Framwork์์๋ Auto Mapping๊ณผ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ์ฐ๊ธฐ ์ํด ์ด ์น๊ตฌ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ๊ฒ์ด์์.
๐ getDeclaredFields๋ก Property ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
ํน์ ๊ฐ์ฒด์ Class๋ก ์ ๊ทผ ์ (getClass() ์ด์ฉ) ๋ด๋ถ์ ํ๋กํผํฐ๋ค์ ์ด๋ฆ์ getDeclaredFields๋ฅผ ์ด์ฉํ์ฌ Field์ ๋ฐฐ์ด ํํ๋ก ๊ฐ์ ธ์ฌ ์ ์๋ ๊ฒ์ด๋ค์.
์๋ฅผ ํ๋ ๋ค์ด ๋ณผ๊ฒ์. ์๋ ์ฒ๋ผ `DevInquryVO`๋ผ๋ Class๊ฐ ์๊ณ , ์ด Class์ ๊ฐ์ฒด๋ฅผ devVO๋ผ๊ณ ํ ๊ฒ์ด์์.
์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ด์ฉํ๊ฒ ๋๋ฉด fields ๋ด๋ถ์ devVO์ ํ๋กํผํฐ์ ๋ํ ์ ๋ณด๊ฐ ๋ด๊ธฐ๋ ๊ฒ์ด์์.
์ฃผ๋ํ๋์ ์ด๋ฅผ ํ๋ฒ ์ด์ฉํด ๋ณด๋ฉด์ ํ๋กํผํฐ์ ๊ฐ์ ๋ฃ์ด ๋ณด๋ ค๊ณ ํ๋ ๊ฒ์ด์์.
์์ ๊ฐ์ด ๋ฐ๋ณต๋ฌธ์ ์ด์ฉํด์ Array์ ์ ์ฒด๋ฅผ ํ์ธ ํด ๋ณด๋ ๊ฒ์ด ๊ฐ๋ฅํด ์ง๋ ๊ฒ์ด์์.
๊ทธ๋ฐ ๋ค devVO์ ๋ด๋ถ ํ๋กํผํฐ๋ฅผ Field Class๋ฅผ ์ด์ฉํด์ ๊ฐ์ ์ด์ฉํ๋ ค๊ณ ํ๋ ๊ฒ์ด์์.
๊ทธ๋ผ 77๋ฒ์งธ ์ค์ ์ด๋ค ๊ฒ์ผ๊น์? `setAccessible()`์ Field, Method์ ์ ๊ทผ์ ์ด ์ง์์์ ์ํ ์ ์ด๋ฅผ ๋ณ๊ฒฝํ ์ ์๊ฒ ํด ์ฃผ๋ Method์ธ ๊ฒ์ด์์. ์ผ๋ฐ์ ์ผ๋ก private ์ธ์คํด์ค(Member) ๋ณ์๋, Method๋ ํด๋น Class์ ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๋ ๊ฒ์ด์์. ๋ง์ฝ ์ด๋ ๊ฒ private๋ก ๋์ด ์๋ ๊ฒ์ ์ ๊ทผํ๋ ค๊ณ ํ๋ฉด Exception์ด ํฐ์ ธ ๋ฒ๋ฆด ๊ฒ์ด์์.
์ด ๋, `setAccessible(true)`๋ฅผ ์ด์ฉํ๊ฒ ๋๋ฉด ๋ฌธ์ ์์ด ์ ๊ทผํ ์ ์๋ ๊ฒ์ด์์.
๊ฒฐ๊ตญ field ๊ฐ์ฒด์ ๋ง์ ๊ป ์ ๊ทผํ๊ธฐ ์ํด ์ฌ์ฉ ํ๋ค๊ณ ์๊ฐํ๋ฉด ์ข์ ๊ฒ์ด์์.
๊ทธ๋์ผ ๋ค์ ์ค์ getter๋ฅผ ํตํด ์ถ๋ ฅ์ ํ ์ ์์ ๊ฒ์ด๋๊น์!
System.out.println์ ์ด์ฉํ์ง ์๊ณ , System.err.println์ ์ด์ฉํ ๊ฒ์ ๋ฐ๋ก ์์ ์ฌ์ง์ฒ๋ผ ๋นจ๊ฐ๊ฒ ๊ฐ์กฐํ์ฌ ์ถ๋ ฅ๋๊ฒ ํ๊ณ ์ถ์๊ธฐ ๋๋ฌธ์ธ ๊ฒ์ด์์!
๐ฝ Reflection ์ฌ์ฉ ์ ๊ณ ๋ฏผ ์ฌํญ
1) Reflection์ ์ด์ฉํ Code๋ ์ฑ๋ฅ Issue๊ฐ ๋ฐ์.
- ์ ์ ํ๊ฒ ์ ์ฌ์ฉํ๋ค๋ฉด ์ฑ๋ฅ ํฅ์์ ๊ธฐ๋ ํ ์ ์๋ ๊ฒ์ด์์.
2) Reflection์ ์ด์ฉํ์ฌ ๊ฐ๋ฐํ ํ๋ก๊ทธ๋จ์ Error๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ๊ณ , ๋๋ฒ๊น
์ด ์ด๋ ต๋ค.
- Reflection์ ์ปดํ์ผ ์ Type Checking์ ํ ์ ์๋ ๊ฒ์ด์์. ๋ฐ๋ผ์ ๋ฐํ์ ์ ์๋ชป ๋ ๋งค๊ฐ ๋ณ์๋ก
์ธํด ๋ฐํ์ ์๋ฌ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์ด ๊ฒ์ด์์. ํ์ง๋ง, ์ ์ ํ ์ฌ์ฉ๋ ๋ฐํ์ ์๋ฌ Message๋ฅผ ์ด์ฉํด
์ถฉ๋ถํ ๋๋ฒ๊น
์ด ์ฌ์ด ํ๊ฒฝ์ผ๋ก ๋ง๋ค ์ ์๋ค๊ณ ํ๋ ๊ฒ์ด์์.
3) Reflection์ ์ด์ฉํ Code๋ ๋ณต์กํ๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฒด ์์ฑ, Method ํธ์ถ Code์ ๋น๊ตํ๋ฉด ๋ณต์กํ ๊ฒ์ด ์ฌ์ค์ธ ๊ฒ์ด์์. ํ์ง๋ง, Class
Type ๋น๊ต๋ฅผ ํ ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ Code์ ๊ฒฝ์ฐ, ๋๋์ ์กฐ๊ฑด๋ฌธ(if / else)์ ๋ง๋ค์ด์ผ ๋ ์ ์๊ธฐ
๋๋ฌธ์ ๊ทธ๊ฒ ๋ณด๋ค Reflection์ ์ด์ฉํ์ฌ ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ ๋ค๋ฉด ์คํ๋ ค Code๋ฅผ ๋จ์ํ
ํ ์ ์๋ ๊ฒ์ด์์.
'๊ฐ๋ ์ ๋ฆฌ ์์ ์ค > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA] Object Class (2) | 2022.03.25 |
---|---|
[JAVA] String Instance / Constant Pool์ด๋? (0) | 2022.03.24 |
[Java] ๋คํ์ฑ(polymorphism) (0) | 2021.09.18 |
[JAVA] Class Method(static Method)์ ์ธ์คํด์ค Method (0) | 2021.09.13 |
[JAVA] Optional<T> (0) | 2021.06.23 |