반응형
지난 번 운이 좋아 여러 대기업 면접을 보게 되었는데
k사 기술 면접에서
자바 리플렉션이라고 물었던 적이 있다..
난 당시에 대답을 시원하게 하지 못했다 😓
사실 웹 개발자가 리플렉션을 사용할 일은 드물것이라고 생각이 든다...
그래서 .. Java Reflection 이란 무엇인가요? 🤔
- 자바 리플렉션은 프로그램이 실행 중일 때 클래스, 메서드, 필드 등을 동적으로 조회하고 조작할 수 있게 해주는 기능
- 이를 통해 런타임에 클래스의 구조를 알아내고, 객체의 메서드를 호출하거나 필드의 값을 수정할 수 있다.
- 자바에서 이미 로딩이 완료된 클래스에서 또 다른 클래스를 동적으로 로딩 (Dynamic Loading)하여 생성자(Constructor), 멤버 필드(Member Variables) 그리고 멤버 메서드 (Member Method) 등을 사용할 수 있는 기법
- 구체적인 Class Type을 알지 못하더라도 해당 Class의 method, type, variable들에 접근할 수 있도록 해주는 자바 API이며, 컴파일된 바이트 코드를 통해 Runtime에 동적으로 특정 Class의 정보를 추출할 수 있는 프로그래밍 기법
리플렉션의 주요 특징 🛠️
- 동적 클래스 정보 조회: 객체의 클래스 타입, 메서드, 필드 등의 정보를 런타임에 확인할 수 있다.
- 객체 생성 및 메서드 호출: 클래스의 인스턴스를 동적으로 생성하고, 메서드를 호출할 수 있다.
- 접근 제어 무시: private이나 protected 접근 제한자를 무시하고 필드나 메서드에 접근할 수 있다.
리플렉션을 사용하는 이유 🎉
- 플러그인 시스템: 특정 클래스나 메서드가 미리 정의되어 있지 않은 애플리케이션에서 확장 기능을 추가할 때 유용
- 프레임워크 및 라이브러리 개발: Spring, Hibernate 등 프레임워크는 리플렉션을 활용해 빈 생성, 의존성 주입 등을 동적으로 처리함
- 유연성: 컴파일 타임에 정의되지 않은 객체와의 상호작용이 가능.
리플렉션의 단점
- 성능 저하: 리플렉션은 일반적인 코드보다 더 많은 자원을 사용하므로 성능이 떨어질 수 있다.
- 컴파일 시 안전성 부족: 런타임 오류가 발생할 가능성이 크다.
- 캡슐화 위반: 접근 제어자를 무시할 수 있어, 잘못 사용하면 보안 및 유지보수 측면에서 문제가 될 수 있다.
언제 리플렉션을 사용해야 할까?
리플렉션은 고급 기능으로, 주로 프레임워크 개발이나 동적 기능이 필요한 상황에서 사용된다.
하지만 성능 문제와 유지보수성 고려가 필요하므로, 가능하다면 사용을 최소화하고 대체 방안을 고려하는 것이 좋다.
예제 코드
디렉토리
<code>
java-reflection-study/
│
├── src/
│ ├── Main.java
│ ├── com/
│ │ └── example/
│ │ ├── examples/
│ │ │ ├── ClassInfoExample.java
│ │ │ ├── FieldAccessExample.java
│ │ │ ├── MethodInvocationExample.java
│ │ └── interfaces/
│ │ │ └── ReflectionExample.java
│ │ ├── utils/
│ │ │ └── ReflectionUtils.java
│ │ ├── MyClass.java
│ │ ├── Person.java
│ │ └── ExampleRunner.java
│
└── README.md
</code>
main.java
import com.example.ExampleRunner;
/**
* 프로그램의 진입점으로, ExampleRunner를 사용해 리플렉션 예제를 실행합니다.
*/
public class Main {
public static void main(String[] args) {
ExampleRunner exampleRunner = new ExampleRunner();
exampleRunner.runExamples();
}
}
객체 지향적 설계 하기 위해 공통으로 사용되는 메소드는 인터페이스로 관리
package com.example.interfaces;
/**
* 리플렉션 예제를 위한 공통 인터페이스입니다.
*/
public interface ReflectionExample {
/**
* 리플렉션 예제를 실행하는 메서드입니다.
*/
void runExample();
}
예제 실행 클래스
package com.example;
import com.example.examples.ClassInfoExample;
import com.example.examples.FieldAccessExample;
import com.example.examples.MethodInvocationExample;
import com.example.interfaces.ReflectionExample;
import java.util.ArrayList;
import java.util.List;
/**
* 다양한 리플렉션 예제를 실행하는 클래스입니다.
*/
public class ExampleRunner {
private final List<ReflectionExample> examples = new ArrayList<>();
public ExampleRunner() {
// 예제를 리스트에 추가
examples.add(new ClassInfoExample(MyClass.class));
examples.add(new MethodInvocationExample(new MyClass(), "sayHello", "Reflection"));
examples.add(new FieldAccessExample(new Person("Alice", 30), "name", "Bob"));
}
/**
* 모든 리플렉션 예제를 실행합니다.
*/
public void runExamples() {
for (ReflectionExample example : examples) {
example.runExample();
}
}
}
클래스 정보 출력하는 예제
package com.example.examples;
import com.example.interfaces.ReflectionExample;
import com.example.utils.ReflectionUtils;
/**
* 클래스 정보 출력 예제를 담당하는 클래스입니다.
*/
public class ClassInfoExample implements ReflectionExample {
private final Class<?> clazz;
public ClassInfoExample(Class<?> clazz) {
this.clazz = clazz;
}
@Override
public void runExample() {
System.out.println("=== 클래스 정보 출력 예제 ===");
ReflectionUtils.printClassInfo(clazz);
System.out.println();
}
}
해당 예제 코드 repo Ref https://github.com/DongJu-Na/java-reflection-study
Readme 참고해주세요!
Ref.
자바 리플렉션 예제 연습 샘플 github repo (추가로 들어갈 예제 샘플코드가 있다면 pr을 날려주세요)
https://github.com/DongJu-Na/java-reflection-study
https://www.youtube.com/watch?v=67YdHbPZJn4
반응형
'Develop > Back-End' 카테고리의 다른 글
[SpringBoot] 스프링을 이용하여 가벼운(간단한) 스케줄링 작업 처리하는 방법 😁 (4) | 2024.08.13 |
---|---|
[Java] 모던 자바(Modern JAVA) 란 무엇인가!!!!😒 (feat. 새롭게 추가된 기능들) (105) | 2024.03.24 |
스프링 배치(Spring Batch) 시작하기 !😭 (131) | 2024.02.03 |
스프링 부트 카카오 로그인 API 기능 추가하기 😳 (114) | 2023.10.22 |
Spring Boot 환경에서 Appium을 통해 모바일 환경 테스트 하기 + 플러그인 (09.19 수정) (66) | 2023.09.17 |