본문으로 바로가기
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

자바 리플렉션


리플렉션이란 ?

리플렉션은 구체적인 클래스 타입을 알지 못해도, 그 클래스의 메소드, 타입, 변수들을 접근할 수 있도록 해주는 자바 API입니다. 구체적인 클래스 타입을 알지 못한다라는 의미는 무엇일까 ? 그리고 구체적인 클래스 타입을 알지 못하면 그 클래스의 메소드, 타입, 변수들에 접근할 수 없는 것 일까?



위의 사진과 같이 모든 클래스의 조상 클래스인 Object라는 타입으로 Robot클래스를 담을 수 있지만 사용가능한 메소드는 Object 클래스의 메소드 밖에 없습니다. (이해가 안가면 자바의 다형성을 보면 된다.)

이런 식으로 객체의 구체적인 Class를 모른다면 해당 Class의 메소드와 변수를 사용하지 못하게 됩니다.



Object를 형변환해서 사용하면 ? 해당 클래스의 메소드와 변수에 접근할 수 있습니다.


직접 개발햇는데, 사용할 클래스의 이름과 타입을 모르는 경우가 있을까 ?

JDBC를 예로 들자면 자바 가상머신이 동작을 시작하고 코드가 실행 되기 전까지는 어떤 JDBC 드라이버가 사용이 될지 알 수 없습니다. 자바만 사용해서 DB에 접근하려고 할 때 항상 보이는 코드가 있습니다.

Class.forName("oracle.jdbc.driver.OracleDriver"); 이 것을 사용하여 런타임시에 동적으로 클래스를 로딩하게 된다.


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


Reflection은 실행중인 자바 프로그램 내부를 검사하고, 내부의 속성을 수정할 수 있습니다. reflection이 구체적인 쓰임중에 하나가 빌더툴을 이용해서 소프트웨어 컴포턴트를 만드는 것입니다. 툴은 reflection을 사용해서 동적으로 로딩되는 자바 컴포턴트(class)의 속성을 가져올 수 있습니다.