리플렉션(Reflection)

허성재's avatar
Sep 03, 2024
리플렉션(Reflection)
리플렉션(Reflection)은 프로그램이 실행 시간(runtime)에 자기 자신의 구조(클래스, 메서드, 필드 등)를 조사하고 조작할 수 있는 기능을 말합니다. 이는 주로 동적 언어나 JVM 기반 언어(예: Java, Kotlin)에서 제공하는 기능으로, 컴파일된 코드에서도 실행 중에 클래스나 메서드의 정보를 얻고 사용할 수 있습니다.

리플렉션의 주요 개념

  1. 동적 클래스 로딩:
      • 리플렉션을 사용하면 클래스 이름을 문자열로 받아 해당 클래스를 동적으로 로딩할 수 있습니다. 예를 들어, Java에서 Class.forName("com.example.MyClass")와 같은 방법으로 클래스를 로딩할 수 있습니다.
  1. 클래스 정보 탐색:
      • 리플렉션을 통해 클래스의 메타데이터(예: 클래스 이름, 부모 클래스, 인터페이스, 메서드, 필드 등)를 조사할 수 있습니다. 이를 통해 클래스가 어떤 메서드를 가지고 있는지, 어떤 필드가 정의되어 있는지 등을 알 수 있습니다.
  1. 메서드 및 필드 접근:
      • 리플렉션을 사용하면 특정 클래스의 메서드를 호출하거나 필드에 접근할 수 있습니다. 이를 통해 컴파일 시점에 정해지지 않은 메서드를 실행하거나, 접근이 어려운 필드에 값을 설정할 수 있습니다.
  1. 런타임에 객체 생성:
      • 리플렉션을 이용해 런타임에 새로운 객체를 생성할 수 있습니다. 예를 들어, Java에서 Class.newInstance() 메서드를 사용해 객체를 동적으로 생성할 수 있습니다.

리플렉션의 사용 예시 (Java 기준)

// Class 객체를 얻는 세 가지 방법 Class<?> clazz = MyClass.class; Class<?> clazz2 = Class.forName("com.example.MyClass"); Class<?> clazz3 = myObject.getClass(); // 메서드 정보 얻기 Method method = clazz.getMethod("myMethod", String.class); // 메서드 실행 Object result = method.invoke(myObject, "parameter"); // 필드 정보 얻기 Field field = clazz.getDeclaredField("myField"); // 필드에 값 설정 field.setAccessible(true); // private 필드에 접근 가능 field.set(myObject, "newValue");

리플렉션의 장점

  1. 유연성: 컴파일 시점에 알 수 없는 클래스나 메서드에도 접근할 수 있어 유연한 코드를 작성할 수 있습니다.
  1. 라이브러리 개발: ORM(Object-Relational Mapping)이나 의존성 주입(DI) 프레임워크 등에서 리플렉션을 사용해 객체와 클래스 정보를 동적으로 관리할 수 있습니다.

리플렉션의 단점

  1. 성능 저하: 리플렉션은 일반적인 메서드 호출보다 속도가 느리며, 과도하게 사용하면 프로그램의 성능에 부정적인 영향을 줄 수 있습니다.
  1. 안전성 문제: 컴파일 시점이 아닌 런타임에 오류가 발생할 수 있어, 잘못된 리플렉션 사용은 디버깅을 어렵게 만들 수 있습니다.
  1. 캡슐화 침해: 리플렉션을 통해 private 필드나 메서드에 접근할 수 있어, 객체지향 원칙인 캡슐화를 위반할 가능성이 있습니다.
리플렉션은 매우 강력한 기능이지만, 필요할 때만 신중하게 사용하는 것이 좋습니다.
Share article

heo-gom