리플렉션 (Reflection)
리플렉션은 힙 영역에 로드된 Class 타입의 객체를 통해 구체적인 클래스 타입을 알지 못하더라도 그 클래스의 메서드, 타입, 변수들 즉 인스턴스를 접근할 수 있도록 해주는 자바 API를 말한다. 컴파일 시간이 아닌 실행 시간에 동적으로 특정 클래스의 정보를 추출할 수 있는 프로그래밍 기법이다.
언제 사용할까?
작성 시점에서는 어떠한 클래스를 사용해야 할지 모르지만 런타임 시점에서 가져와 실행해야 하는 경우 즉, 동적으로 클래스를 사용해야 할 때 이용한다. IDE나 프레임워크에서 이런 동적 바인딩을 이용한 기능을 제공한다. 예를 들어 자동완성 기능이나 스프링어노테이션 같은 것들을 말한다.
리플렉션 정보사용
리플렉션을 사용하기 위해서는 java.lang.reflect 패키지의 클래스들을 활용한다. 리플렉션의 주요 작업에 대해 알아보자
Class 클래스
java.lang.Class 클래스는 클래스의 메타 정보를 나타낸다. 클래스의 인스턴스, 메서드, 필드, 생성자 등의 정보를 검사할 때 주로 사용된다.
Class<?> myClass = MyClass.class; // MyClass 클래스의 Class 객체 가져오기
Constructor 클래스
java.lang.reflect.Constructor 클래스는 클래스의 생성자를 나타낸다. 클래스의 인스턴스를 동적으로 생성할 때 사용된다.
Constructor<?> constructor = myClass.getConstructor(parameterTypes);
Object instance = constructor.newInstance(args);
Method 클래스
java.lang.reflect.Method 클래스는 클래스의 메서드를 나타낸다. 메서드를 호출하고 그 결과를 가져오는 데 사용 된다.
Method method = myClass.getMethod("methodName", parameterTypes);
Object result = method.invoke(instance, args);
Field 클래스
java.lang.reflect.Field 클래스는 클래스의 필드(멤버변수)를 나타낸다. 필드가 값을 읽거나 수정하는 데 사용된다.
Field field = myClass.getDeclaredField("fieldName");
field.setAccessible(true);
Object value = field.get(instance);
field.set(instance, newValue);
리플렉션의 장단점
장점
- 동적 코드 조작
런타임 시점에 동적으로 클래스 정보를 조작할 수 있다.
-> 플러그인 시스템, 프레임워크, 라이브러리 등에서 유용하다. - 자동화와 유연성
일반화된 코드를 작성할 수 있으며 애플리케이션의 구성을 동적으로 변경하거나 확장이 가능하다
단점
- 성능 오버헤드
정적코드에 비해 성능 오버헤드를 가지게 된다 실행 시간에 메서드나 필드를 검색하고 호출하는데 시간을 쓰게 된다. - 컴파일 타임 오류 회피
리플렉션을 남용하면 컴파일 타임에 오류를 검출하기 어렵다. 오타나 런타임에 발생하는 예외 같은 문제들이 컴파일 타임에서는 파악하기 어렵게 된다. - 보안 위험
리플렉션을 사용할 때에는 private 필드나 메서드에 접근하는 등 보안 검사를 우회할 수 있으니 주의해야 한다. - 유지 보수 복잡성
리플렉션을 남용하게 되면 가독성과 유지 보수성이 저하될 수 있다. 클래스나 메서드 이름을 하드코딩하는 것보다 동적으로 결정하게 되어 코드의 의도를 파악하기 어려울 수 있다.
'JAVA' 카테고리의 다른 글
Java Robot 클래스 mousePress 적용하기 (0) | 2023.08.31 |
---|---|
Java Robot 클래스 mouseMove 적용하기 (0) | 2023.08.30 |
Java 의 Robot 클래스란? (0) | 2023.08.28 |
[Cron] 크론(cron) 표현식 정리 (0) | 2023.08.16 |
로그 레벨로 로그를 효율적으로 사용하기 (0) | 2023.08.14 |