99클럽 코테 스터디 11일차 TIL Reflection
728x90

란?

Java Reflection 이란 객체를 통해 클래스의 정보를 분석해 내는 프로그램 기법을 말함.

Runtime 시에 Class, Interface, Field 및 method 에 대한 정보를 동적으로 가져오고 조작할 수 있는 기능을 의미함.

사용

  1. 클래스 정보 얻기
    Class 의 이름, Super Class, Interface, Field, Method 목록 등을 가져올 수 있음.
  2. 객체 생성
    Class 의 생성자를 호출하여 객체를 생성할 수 있음.
  3. Field 및 method 접근
    객체의 필드값을 가져오거나 설정하고, 메소드를 호출할 수 있음.
  4. 동적 클래스 로딩
    런타임에 존재하지 않는 클래스를 동적으로 로드하고 사용할 수 있음.

어떨 때 사용해야함?

Java 에서 런타임 시 동적으로 코드를 분석하고 수정해야 하는 경우에 유용함.
외부 라이브러리나 프레임워크와 상호 작용하거나 특정 클래스의 인스턴스를 생성할 때 사용될 수 있음.

특징

  1. 동적 분석 및 조작
    Reflection 을 사용하면 실행 중인 Java 애플리케이션의 구조를 동적으로 조사하고 조작할 수 있음.
  2. 런타임 접근
    클래스의 메타데이터에 런타임에 접근하여 타입 정보를 가져오거나, 객체를 생성하고 메서드를 실행할 수 있음.
Class c = Data.class;

Method[] m = c.getMethods();

Field[] f = c.getFields();

Constructor[] cs = c.getConstructors();

Class[] inter = c.getInterfaces();

Class superClass = c.getSuperclass();
  1. 유연성
    코드를 작성할 때 구체적인 클래스 타입을 명시하지 않고도 작업을 수행할 수 있어 유연성이 높아짐.
  1. API의 일부임
    java.lang.reflect 패키지로 제공되며, Java 의 핵심 부분으로 통합되어 있음.

장점

  1. 확장성
    이미 컴파일된 애플리케이션에 새로운 기능을 동적으로 추가할 수 있음.
    ex) 사용자 정의 클래스를 로딩하고 인스턴스화 하는 플러그인 시스템에 유용함.
  2. 유연한 코드 작성
    컴파일 타임에 알려지지 않은 클래스와 상호작용할 수 있어, 제네릭 프로그래밍을 보다 유연하게 활용할 수 있음.
  3. 디버깅과 테스팅 도구
    개발 중에 내부 상태를 검사하고 문제를 진단하는 데 필요한 테스팅 및 디버깅 도구를 구축하는데 유용함.

단점

  1. 성능저하
    Reflection 은 일반적인 메서드 호출이나 접근보다 훨씬 느릴 수 있음. 런타임에 타입 검사와 메서드 호출을 수행하기 때문에 추가적인 오버헤드가 발생함.
  2. 보안위험
    Reflection 을 사용하면 보안 매니저에서 제한하는 작업을 우회할 수 있어 보안에 취약점을 만들 수 있음.
  3. 복잡성 증가
    Reflection 코드는 분석 및 디버깅이 어려울 수 있으며, 코드의 가독성과 유지관리성을 저하시킬 수 있음.
  4. 컴파일 타임 검사 부재
    Reflection 을 사용하는 코드는 컴파일 타임에 타입 안정성을 제공하지 못하며, 런타임 오류의 가능성을 증가시킴
728x90