기술/Java & Spring

[JAVA] 리플렉션(Reflection)

반응형

✏️개요

이번에 작성할 게시글의 주제는 리플렉션(Reflection)이다. 리플렉션 역시 다른 개념들과 마찬가지로 실무에서 사용하는 코드를 분석하는 과정에서 마주친 개념이다. 필자가 리플렉션이라는 단어를 처음 듣게 된 것은 취업 준비를 하던 시절에 Java 개발자를 위한 면접 질문 리스트에서였다. 그러나 그 당시에는 그렇게 중요해 보이는 개념이 아닌 것 같았고, 실제로 학부생 시절에도 학습했던 적이 없어 넘어갔었지만 실무에서 사용되는 것을 보고 이번 기회에 개념을 잡아보고자 하여 글을 작성하기로 마음먹었다.

 

❗ 본 게시글은 필자 개인적인 의견이므로 틀린 부분이 있을 수 있습니다. 댓글을 통해 지적해주시면 감사하겠습니다.

 

✏️Reflection, 리플렉션

필자가 코드를 분석하는 과정에서 리플렉션이라는 개념에 대해 조사해보기 시작한 것은 아래와 같은 문법들을 만난 뒤였다.

public Object list(String str, boolean bol, Object... params, Class <?> daoClass){...}
daoClass.getMethods();

특히 Class <?>라는 처음 보는 타입을 보고 난 뒤, 관련된 내용을 검색하면서 만난 것이 리플렉션이라는 키워드였다.

 

내가 자주 찾아보는 Oracle Java Documentation에는 리플렉션에 대해서 아래와 같이 설명하고 있다.

Reflection is commonly used by programs which require the ability to examine or modify the runtime behavior of applications running in the Java virtual machine.
...
common uses of reflection for accessing and manipulating classes, fields, methods, and constructors.

간단하게 해석해보면, JVM에서 돌아가는 애플리케이션의 런타임 동작을 수정 또는 검사하기 위한 기능이 필요한 프로그램에서 일반적으로 사용된다고 한다. 또한 동시에 페이지 하단에서 생성자, 메서드, 필드, 클래스에 접근하고 조작하는 일반적인 리플렉션의 사용방법에 대한 별도의 Lesson들이 존재한다.

 

위의 내용들을 종합적으로 유추해본다면 결국 리플렉션이란 것은 런타임에서 클래스 및 클래스의 생성자, 메서드, 필드를 조작하고 검사하는 것을 의미한다고 볼 수 있다.

런타임은 애플리케이션이 실행되고 있는 시점을 의미하고, 컴파일 타임은 애플리케이션을 실행시키기 위해 컴파일하는 시점을 의미한다.

✏️왜 쓸까?

앞서 리플렉션에 대한 개념을 살펴보았기 때문에 왜 사용하는지에 대한 답을 찾는 과정 또한 쉬웠다. 리플렉션의 개념에서 핵심 내용은 아마 런타임일 것이다. 즉, 동적으로 클래스에 대한 정보를 조작 또는 검사하기 때문에 이것의 부족함으로 인해 리플렉션에 대한 필요성이 생길 것이다.

 

Java는 JavaScript, Python 등과 같은 언어들과 다르게 정적 언어이다. 그렇기 때문에 데이터 타입을 포함한 클래스 타입, 필드, 메서드들이 컴파일 타임에 이미 결정이 되어있어야 한다.

만약,

  • 클래스를 활용하는 코드를 작성하는 시점에서 어떤 클래스가 사용될지 모르는 경우.
    • Spring Framework의 어노테이션 기능이 대표적이라 한다.
  • 비슷한 동작을 수행하는 서로 다른 클래스들을 동적으로 교체해가며 사용하는 경우. 
    • 개인적인 생각으로는 이 경우가 필자가 코드 분석 과정에서 발견했던 경우 같다.

리플렉션은 효과적인 수단이 될 것이다.

정적 언어 : 컴파일 타임에 데이터들의 타입을 체크해 타입 안정성이 높은 언어
ex) Java, C, C++...

동적 언어 : 런타임에 데이터들의 타입이 결정되어 자료형 선택의 폭이 넓은 언어
ex) python, javascript...

✏️리플렉션과 관련 있는 클래스

필자는 글의 시작에 있어서 리플렉션이라는 개념에 대해 찾아보기 시작한 계기가 Class <?>라는 클래스 타입 때문이었다고 했다. 앞서 리플렉션에 대해서 알아보았기 때문에 이것이 클래스에 대한 정보를 다루는 클래스라는 것을 알게 되었다. 이제 이와 같은 클래스의 종류에 대해서 알아보자.

리플렉션에 관련 있는 클래스들에 대한 메서드 정보는 별도로 정리하지 않고, Oracle의 Java Documents에 대한 링크로 대신하고자 한다. 어차피 정리해도 기억 안 난다.
  • Class <T>
    • T : 타입 파라미터, Class 타입을 모델링하는 클래스의 타입. (ex. Class <String> : String.class의 객체가 된다.)
    • Class 클래스의 객체는 실행 중인 애플리케이션의 클래스와 인터페이스를 나타내는 것.
    • Class 클래스는 생성자가 없지만, JVM에 의해 자동으로 로드된다. 
    • Oracle java Doc : https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html
 

Class (Java Platform SE 8 )

Determines if the specified Class object represents a primitive type. There are nine predefined Class objects to represent the eight primitive types and void. These are created by the Java Virtual Machine, and have the same names as the primitive types tha

docs.oracle.com

Class 클래스의 객체가 생성자가 없지만 생성될 수 있는 자세한 이유는 아래 블로그를 참조하자.
https://geekhub.tistory.com/67
 

[java]리플렉션(reflection)

리플렉션이란? 리플렉션은 자바만의 독특한 기능이다. Reflection은 '투영, 반사'의 사전적 의미를 갖고 있다. 간단하게 자바의 리플렉션을 정의하자면 '객체를 이용해 클래스의 정보를 분석하는

geekhub.tistory.com

 

 

Constructor (Java Platform SE 8 )

Returns a string describing this Constructor, including type parameters. The string is formatted as the constructor access modifiers, if any, followed by an angle-bracketed comma separated list of the constructor's type parameters, if any, followed by the

docs.oracle.com

 

Method (Java Platform SE 8 )

Returns a string describing this Method, including type parameters. The string is formatted as the method access modifiers, if any, followed by an angle-bracketed comma-separated list of the method's type parameters, if any, followed by the method's generi

docs.oracle.com

✏️마치며

리플렉션에 대해서 조사할수록 그에 대한 다양한 사용방법이 나온다. 그 방법들이 굉장히 다양하기도 하고 하나씩 살펴본다고 해도 어차피 기억 못 하기 때문에, 필자는 중심 있게 살펴본 개념을 바탕으로 실무에서 사용되는 메서드들의 용법들을 하나하나 확인하고자 한다.

반응형