💋 인트로
안녕하세요. 우아한테크코스 5기 깃짱이라고 합니다.
이번 포스팅에서는, JAVA Reflectoin API에 대해서 알아보려고 한다.
개인적으로 공부하기 전에는 한없이 어렵게 느껴졌고, 개념이 뭔지 찾아봐도 잘 모르겠었지만, 스스로 Spring MVC 프레임워크를 구현하기 위해서 공부하고 사용한 이후로는 굉장히 개념이 명확하게 다가왔다.
이 개념이 많이 어렵게 느껴진다면, 아래 예시 코드부터 살펴보는 것을 추천한다!
💋 Reflection API
✔️ Reflection이란?
- 구체적인 클래스 타입을 알지 못해도 그 클래스의 정보(메서드, 타입, 변수 등등)에 접근할 수 있게 해주는 자바 API
- 컴파일한 클래스를 동적으로 프로그램이 가능하도록 자바에서 지원하는 기능
- Java 클래스의 필드, 메서드 이름을 가져와서 표시할 수 있다.
- 프레임워크에서 많이 쓰는 기술로, 실무에서 사용하는 코드에서 리플렉션을 사용한다는 전제 하에 코드를 작성하면 가독성도 떨어지고 성능도 떨어지게 된다.
- 프레임워크나 라이브러리는 사용자가 어떤 클래스를 만들지 예측할 수 없기 때문에 동적으로 해결해주기 위해 Reflection을 사용한다.
- Reflection API는 자바의 강력한 기능 중 하나지만, 잘못 사용하면 프로그램의 안정성이나 성능에 영향을 줄 수도 있으니까 주의해야 한다.
✔️ Reflection으로 가능한 작업
- Junit처럼
@Test
어노테이션을 표시한 메서드를 찾아서 실행 할 수 있다. - 런타임 객체의 클래스, 필드, 메서드 정보를 알 수 있다.
- IDE가 자동으로
getter
,setter
메서드를 생성 할 수 있다. - 자바 객체와 데이터베이스 테이블을 매핑 할 때 사용한다.
💋 Reflection API 사용 예시 코드
아래에서 소개하는 내용은 Baeldung에 올라와있는 튜토리얼이다.
모든 부분이 이 포스팅에서 등장하지는 않으니, 자세한 내용을 더 알아보고 싶다면 위에 첨부한 링크를 타고 들어가면 확인할 수 있다.
가령, 우리가 다음과 같은 클래스가 있다고 가정해보자.
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void sayHello() {
System.out.println("안녕하세요, 저는 " + name + "이고 " + age + "살입니다.");
}
}
이제 Reflection API를 사용하여 이 클래스의 정보를 알아내고, 인스턴스를 생성하고, 메소드를 호출하는 예시를 보여주겠다.
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ReflectionExample {
public static void main(String[] args) throws Exception {
// 클래스 정보 가져오기
Class<?> personClass = Person.class;
// 필드 정보 가져오기
Field[] fields = personClass.getDeclaredFields();
for (Field field : fields) {
System.out.println("필드: " + field.getName());
}
// 생성자 호출하여 인스턴스 생성
Constructor<?> constructor = personClass.getDeclaredConstructor(String.class, int.class);
constructor.setAccessible(true);
Object person = constructor.newInstance("John", 25);
// 메소드 호출
Method sayHelloMethod = personClass.getDeclaredMethod("sayHello");
sayHelloMethod.invoke(person);
}
}
위의 예시 코드에서는 먼저 Person 클래스의 정보를 가져오기 위해 Class<? ?>
타입의 변수 personClass
를 선언하였다. 이후 getDeclaredFields()
메소드를 사용하여 클래스의 필드 정보를 가져와서 출력한다.
그 다음은 생성자를 호출하여 Person 클래스의 인스턴스를 생성하는 부분이다. getDeclaredConstructor()
메소드를 사용하여 생성자 정보를 가져온 뒤, newInstance()
메소드를 호출하여 인스턴스를 생성한다.
마지막으로, getDeclaredMethod()
메소드를 사용하여 sayHello()
메소드 정보를 가져온 뒤, invoke()
메소드를 사용하여 해당 메소드를 호출한다.
이렇게 Reflection API를 사용하면 클래스의 정보를 알아내고, 동적으로 인스턴스를 생성하고, 메소드를 호출할 수 있다.
💋 참고자료
- https://tecoble.techcourse.co.kr/post/2020-07-16-reflection-api/
- https://docs.oracle.com/javase/tutorial/reflect/
도움이 되었다면, 공감/댓글을 달아주면 깃짱에게 큰 힘이 됩니다!🌟
'JAVA' 카테고리의 다른 글
[JAVA] try-with-resources를 사용해서 리소스 누수를 방지하자! (0) | 2023.09.29 |
---|---|
[JAVA] Java Reflection API에서 클래스 이름 가져오기: getName() vs getCanonicalName() (0) | 2023.09.12 |
[JAVA] 멀티 쓰레드의 동기화(synchronization): 메서드, 메서드 내 블록에 synchronized 키워드를 붙이자! (0) | 2023.09.10 |
[JAVA] 쓰레드 풀(Thread Pool): 개념, 장점, 사용 방법, 코드 예시 (feat. Baeldung) (0) | 2023.09.09 |
[JAVA] 프로세스와 스레드: 개념, Java의 쓰레드 구현, I/O Blocking (0) | 2023.09.08 |