본문 바로가기

컴퓨터/JAVA

자바 고급 스터디 6. 리플렉션 (reflextion)

반응형

자바 고급 스터디 목록

공부 시간 : 2021/04/07 21:20 ~ 22:40

6주차. 리플렉션에 대해서 설명하세요.

리플렉션이란?

리플렉션은 구체적인 클래스 타입을 알지 못해도, 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API

리플렉션의 정의를 보고 한번에 이해하기는 쉽지않다. 구체적인 클래스 타입을 알지 못해도??? 라는 것이 정확히 어떤 의미인지 선뜻 이해하기 어렵고, 또 구체적인 클래스 타입을 모르는 것을 사용할 일이 있을까? 라 생각이 들기도 한다.

먼저 구체적인 클래스 타입을 모르는 것의 예시를 들어보자.

public class Student() {

    public void study() {
        // do study
    }

    public static void main(String[] args) {
        Object student = new Student();
        student.study();
    }
}

위 코드가 정상적으로 컴파일 될지 안될지 생각해보자.

Object 타입으로 student를 선언하고 Student 클래스의 인스턴스를 담았다. 이까지는 아무런 문제가 발생하지 않는다.
문제가 되는 것은 study() 메서드를 실행하려고 할때이다. Object 타입으로 선언된 객체의 경우에 Object 메소드 혹은 변수만 접근가능하기 때문이다.

구체적인 클래스타입을 모른다는 것을 다시 풀어서 말해보자면, "자바는 컴파일 시점에 클래스의 타입이 결정되기 때문에 런터임에서 어떤 클래스타입이 사용될지 모른다는."라고 표현 할 수 있다.

다시 정리하면, 리플렉션은 컴파일 시점이 아닌 런타임 시점에서 클래스 타입을 동적으로 바인딩 할 수 있는 기술이라고 말할 수 있다.

리플렉션 사용 예시

리플렉션이 어떤 방식으로 어떻게 사용되고 있는지 알아보자.
대표적인 사용 예로는 스프링의 DI(dpendency injection), 스프링 어노테이션, Intellij에서 지원해주 자동완성, Proxy 등이 있다.

좀 더 자세하게 알아보자. 스프링에서 @Controller 어노테이션을 붙힌 클래스는 자동으로 스프링빈으로 등록되어 관리된다.
스프링 개발자는 @Controller에 대한 코드를 짤때 사용자가 어떤 클래스를 만들지, 알지 못했다.

또한 스프링에서 생성자 주입을 할때 어떻게 모든 메서드마다 파라미터의 타입 갯수데 등이 다른데 어떻게 알고 바인딩해줄까?

위와 같은 상황에서 리플렉션을 사용하면 원하는 문제를 해결 할 수 있다.

리플렉션이 동작되는 원리

리플렉션이 무엇인지 알았다면 이제는 어떻게 동작되는지 알아보자.

클래스로더에의해 로딩된 자바코드는 컴파일시에 바이트코드로 변경되어 메모리에 저장된다. 클래스 정보는 컴파일되어 Heap영역, Metaspace에 저장된다.
리플렉션을 사용하면 런타임시에 위 영역에 접근하여 클래스의 정보, 접근제어자, 패키지, 어노테이션 등등을 알아낼수 있는 것이다.

예를 들어 좀 더 자세히 말해보자면, @Controller 어노테이션이 사용된 클래스를 알아내고 싶다면, 리플렉션을 사용해 Heap영역, Metaspace에서 모든 클래스 정보를 불러오고,
그 중 어노테이션에 @Controller가 포함되어 있는 클래스를 가져오면 된다.

리플렉션을 활용해 알아낼수 있는 정보는 다음과 같다.

  • ClassName
  • Class Modifiers
  • Package Info
  • Superclass
  • Implemented Interfaces
  • Constructors
  • MethodsFields
  • Annotations

리플렉션 사용시 주의점

  • 리플렉션은 저렴한 자원이 아니다.
  • 컴파일 타임에 확인되지 않는 에러를 발생시킬 가능성이 있다.
  • 접근지시자를 무시할 수 있다.
  • 리플렉션을 남발하면 디버깅하기 어렵다.

참고 사이트 :

반응형