728x90
반응형
SMALL
안녕하세요! 😊
오늘은 Java Reflection API에 대해 알아볼 거예요.
Reflection(리플렉션)은 "자신을 들여다본다"는 뜻으로, 프로그램이 실행 중에 클래스, 메서드, 변수 등을 동적으로 탐색하고 수정할 수 있게 도와줍니다. 처음 들으면 어렵게 느껴질 수 있지만, 이해하면 매우 강력한 도구예요. 함께 차근차근 배워봐요! 💪
Java Reflection API란? 🔍
Reflection은 Java 프로그램이 실행 중에 클래스나 객체의 정보를 읽거나 수정할 수 있는 기능을 제공합니다.
- 👉 비유: 사람이 거울을 통해 자기 자신을 관찰하고 수정할 수 있는 것과 같아요.
Reflection으로 할 수 있는 일
- 클래스의 이름, 메서드, 필드, 생성자 등 정보 확인
- private 메서드나 필드에 접근
- 객체를 동적으로 생성하거나 메서드 실행
Reflection이 필요한 이유
Reflection은 동적인 상황에서 매우 유용합니다.
- 예: 플러그인 시스템, 테스트 도구, JSON 직렬화, 프레임워크(Spring, Hibernate) 등에서 사용됩니다.
하지만, 남용하면 성능 저하와 보안 문제가 생길 수 있으니 꼭 필요한 상황에서만 사용하세요. 😊
Reflection 예제 🌟
1. 클래스 정보 탐색하기
클래스 이름, 메서드, 필드 등을 탐색하는 코드입니다.
import java.lang.reflect.Method;
import java.lang.reflect.Field;
class Person {
private String name = "John";
public int age = 25;
public void greet() {
System.out.println("Hello, my name is " + name);
}
}
public class ReflectionExample {
public static void main(String[] args) throws Exception {
// 1. 클래스 정보 가져오기
Class<?> personClass = Person.class;
// 2. 클래스 이름 출력
System.out.println("클래스 이름: " + personClass.getName());
// 3. 필드 정보 출력
Field[] fields = personClass.getDeclaredFields();
System.out.println("필드:");
for (Field field : fields) {
System.out.println(" " + field.getName() + " (타입: " + field.getType().getName() + ")");
}
// 4. 메서드 정보 출력
Method[] methods = personClass.getMethods();
System.out.println("메서드:");
for (Method method : methods) {
System.out.println(" " + method.getName());
}
}
}
동작 설명:
Class<?> personClass
로Person
클래스의 정보를 가져옵니다.getDeclaredFields()
로 클래스의 필드를 탐색합니다.getMethods()
로 클래스의 메서드 이름을 가져옵니다.- 실행하면 클래스 이름, 필드, 메서드 목록이 출력됩니다.
2. private 필드에 접근하기 🔑
Reflection으로 private 변수에 접근하고 값을 수정하는 코드입니다.
import java.lang.reflect.Field;
class Person {
private String name = "John";
public String getName() {
return name;
}
}
public class ReflectionAccessExample {
public static void main(String[] args) throws Exception {
// 1. Person 객체 생성
Person person = new Person();
// 2. 클래스 정보 가져오기
Class<?> personClass = person.getClass();
// 3. private 필드 가져오기
Field nameField = personClass.getDeclaredField("name");
// 4. private 필드 접근 가능하도록 설정
nameField.setAccessible(true);
// 5. private 필드 값 변경
nameField.set(person, "Alice");
// 6. 변경된 값 출력
System.out.println("변경된 이름: " + person.getName());
}
}
동작 설명:
getDeclaredField("name")
로name
필드를 가져옵니다.setAccessible(true)
로 접근 제한을 해제합니다.set
메서드로name
값을 변경하고,getName()
으로 변경된 값을 확인합니다.- 출력:
변경된 이름: Alice
Reflection 사용 시 주의점 ⚠️
- 성능 저하: Reflection은 일반적인 메서드 호출보다 느립니다.
- 보안 문제: private 필드나 메서드에 접근할 수 있기 때문에 잘못 사용하면 위험합니다.
- 컴파일러 검증 불가: 런타임 오류가 발생할 가능성이 높아집니다.
이해가 어렵다면? 😅
Reflection은 초보자에게 생소하게 느껴질 수 있지만, 중요한 개념입니다.
🔑 팁:
- Reflection의 기본은 클래스와 객체의 구조를 탐색하는 데 있다고 생각하세요.
- 직접 따라 하면서 클래스 정보와 동작을 확인해 보세요. 😊
왜 중요한가요?
Reflection은 프레임워크(Spring, Hibernate 등)와 라이브러리에서 동적 처리를 가능하게 하는 핵심 기술입니다.
이 개념을 이해하면 더 깊이 있는 Java 프로그래밍을 할 수 있어요! 🚀
오늘도 학습하느라 정말 고생 많으셨어요! 😊
조금씩 배워가다 보면 Reflection도 점점 익숙해질 거예요. 여러분의 성장을 항상 응원합니다. 화이팅! ❤️
728x90
반응형
SMALL
'JAVA > JAVA 조금 더 깊게!' 카테고리의 다른 글
Java로 RESTful API 연동하기: GET, POST 요청 예제와 초보자 가이드 (0) | 2024.12.22 |
---|