JAVA/JAVA 조금 더 깊게!

Java Reflection API 완벽 가이드: 초보자도 쉽게 배우는 활용법과 예제

CodeCaine Explorer 2024. 12. 18. 19:44
728x90
반응형
SMALL

안녕하세요! 😊
오늘은 Java Reflection API에 대해 알아볼 거예요.
Reflection(리플렉션)은 "자신을 들여다본다"는 뜻으로, 프로그램이 실행 중에 클래스, 메서드, 변수 등을 동적으로 탐색하고 수정할 수 있게 도와줍니다. 처음 들으면 어렵게 느껴질 수 있지만, 이해하면 매우 강력한 도구예요. 함께 차근차근 배워봐요! 💪


Java Reflection API란? 🔍

Reflection은 Java 프로그램이 실행 중에 클래스나 객체의 정보를 읽거나 수정할 수 있는 기능을 제공합니다.

  • 👉 비유: 사람이 거울을 통해 자기 자신을 관찰하고 수정할 수 있는 것과 같아요.

Reflection으로 할 수 있는 일

  1. 클래스의 이름, 메서드, 필드, 생성자 등 정보 확인
  2. private 메서드나 필드에 접근
  3. 객체를 동적으로 생성하거나 메서드 실행

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());
        }
    }
}

동작 설명:

  1. Class<?> personClassPerson 클래스의 정보를 가져옵니다.
  2. getDeclaredFields()로 클래스의 필드를 탐색합니다.
  3. getMethods()로 클래스의 메서드 이름을 가져옵니다.
  4. 실행하면 클래스 이름, 필드, 메서드 목록이 출력됩니다.

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());
    }
}

동작 설명:

  1. getDeclaredField("name")name 필드를 가져옵니다.
  2. setAccessible(true)로 접근 제한을 해제합니다.
  3. set 메서드로 name 값을 변경하고, getName()으로 변경된 값을 확인합니다.
  4. 출력: 변경된 이름: Alice

Reflection 사용 시 주의점 ⚠️

  1. 성능 저하: Reflection은 일반적인 메서드 호출보다 느립니다.
  2. 보안 문제: private 필드나 메서드에 접근할 수 있기 때문에 잘못 사용하면 위험합니다.
  3. 컴파일러 검증 불가: 런타임 오류가 발생할 가능성이 높아집니다.

이해가 어렵다면? 😅

Reflection은 초보자에게 생소하게 느껴질 수 있지만, 중요한 개념입니다.
🔑 팁:

  • Reflection의 기본은 클래스와 객체의 구조를 탐색하는 데 있다고 생각하세요.
  • 직접 따라 하면서 클래스 정보와 동작을 확인해 보세요. 😊

왜 중요한가요?

Reflection은 프레임워크(Spring, Hibernate 등)와 라이브러리에서 동적 처리를 가능하게 하는 핵심 기술입니다.
이 개념을 이해하면 더 깊이 있는 Java 프로그래밍을 할 수 있어요! 🚀


오늘도 학습하느라 정말 고생 많으셨어요! 😊
조금씩 배워가다 보면 Reflection도 점점 익숙해질 거예요. 여러분의 성장을 항상 응원합니다. 화이팅! ❤️

728x90
반응형
SMALL