brunch

You can make anything
by writing

C.S.Lewis

by 강관우 Mar 20. 2016

자바의 리플렉션

java reflection를 이해하시나요?

Java Reflection API를 이해하시나요?

 리플렉션이란 개념은 초보 자바 개발자에게는 생소한 개념이고, 이해하기 힘든 개념인 것 같습니다. 일단 저에겐 그랬습니다. 그래서 면접에서 위 질문이 나왔다면 '들어봤다'라고 밖에 답변을 못했겠죠..


 리플렉션이 뭘까요? 왜 필요한 것이고, 어떻게, 어디서 사용되는 걸까요?


 남들 다하는 것처럼 간단히 정의를 내리자면 '리플렉션은 구체적인 클래스 타입을 알지 못해도, 그 클래스의 메소드, 타입, 변수들을 접근할 수 있도록 해주는 자바 API'입니다. 이렇게 간단한 문장에서도 저 같은 초보 개발자들은 헷갈립니다. 


 "구체적인 클래스 타입을 알지 못하면 메소드를 실행할 수 없나?"


 네. 못하죠. 아래 코드를 한번 보겠습니다.


public class Car{
    public void drive(){
        //doSomeThing
    }
}

public class Main{
    public static void main(String[] args){
        Object car = new Car();
        car.drive(); // 컴파일 에러
    }
}


 위에 코드 블록에서 컴파일 에러가 나는 이유는 모든 클래스의 조상 클래스인 Object라는 타입으로 Car 클래스의 인스턴스를 담을 수는 있지만 사용 가능한 메소드는 Object의 메소드와 변수들 뿐이기 때문입니다. 그러니까 car의 메소드는 사용하지 못하는 것이죠. 


 이런 식으로 구체적인 타입의 클래스를 모를 때 사용하는 게, 리플렉션이라고 합니다. 그런데 또 의문입니다.


 "내가 만드는 프로그램의 코드 흐름인데, 내가 사용할 클래스의 이름과 타입을 모르는 경우가 있나?"


  일반적인으로는 만나기 힘든 경우이지만, 코드를 작성할 시점에는 어떤 타입의 클래스를 사용할지 모르는 경우가 있습니다. 이럴 때는 실행할 시점, 그러니까 런타임에 지금 실행되고 있는 클래스를 가져와서 실행을 해야 되는 것입니다. 


 대표적으로 프레임워크나 IDE에서 이러한 동적 바인딩을 이용한 기능을 제공하는데 IntelliJ의 자동완성, 스프링 프레임워크의 어노테이션과 같은 기능이 바로 설계할 때는 사용될 클래스가 어떤 타입인지 모르지만 리플렉션을 이용해서 코드를 일단 작성하고 실행 시점에 확인해서 활용할 수 있도록 하는 메커니즘입니다.


Reflection은 구체적인 클래스 타입을 알지 못해도, 그 클래스의 메소드, 타입, 변수들을 접근할 수 있도록 해주는 Java API

 

  그렇다면 어떻게 이게 가능한 것일까요?

 

 자바 클래스 파일은 바이트 코드로 컴파일되어 Static 영역에 위치하게 됩니다. 때문에 클래스 이름만 알고 있다면, 언제든 이 영역을 뒤져서 클래스에 대한 정보를 가져올 수 있는 것입니다. 아래는 가져올 수 있는 정보들입니다.


ClassName
Class Modifiers (public, private, synchronized 등)
Package Info
Superclass
Implemented Interfaces
Constructors
MethodsFields
Annotations  



 리플렉션 사용방법에 대한 내용은 아래 레퍼런스들로 대신합니다.


http://gyrfalcon.tistory.com/entry/Java-Reflection

https://docs.oracle.com/javase/tutorial/reflect/


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari