자바 리플렉션
리플렉션이란 ?
리플렉션은 구체적인 클래스 타입을 알지 못해도, 그 클래스의 메소드, 타입, 변수들을 접근할 수 있도록 해주는 자바 API입니다. 구체적인 클래스 타입을 알지 못한다라는 의미는 무엇일까 ? 그리고 구체적인 클래스 타입을 알지 못하면 그 클래스의 메소드, 타입, 변수들에 접근할 수 없는 것 일까?
위의 사진과 같이 모든 클래스의 조상 클래스인 Object라는 타입으로 Robot클래스를 담을 수 있지만 사용가능한 메소드는 Object 클래스의 메소드 밖에 없습니다. (이해가 안가면 자바의 다형성을 보면 된다.)
이런 식으로 객체의 구체적인 Class를 모른다면 해당 Class의 메소드와 변수를 사용하지 못하게 됩니다.
Object를 형변환해서 사용하면 ? 해당 클래스의 메소드와 변수에 접근할 수 있습니다.
직접 개발햇는데, 사용할 클래스의 이름과 타입을 모르는 경우가 있을까 ?
JDBC를 예로 들자면 자바 가상머신이 동작을 시작하고 코드가 실행 되기 전까지는 어떤 JDBC 드라이버가 사용이 될지 알 수 없습니다. 자바만 사용해서 DB에 접근하려고 할 때 항상 보이는 코드가 있습니다.
Class.forName("oracle.jdbc.driver.OracleDriver"); 이 것을 사용하여 런타임시에 동적으로 클래스를 로딩하게 된다.
이게 가능한 이유는 자바 클래스 파일은 바이트 코드로 컴파일 되어 static 영역에 위치하게 됩니다. 때문에 클래스 이름만 알고 있다면, 언제든 이 영역을 뒤져서 클래스에 대한 정보를 가져올 수 있습니다.
Reflection은 실행중인 자바 프로그램 내부를 검사하고, 내부의 속성을 수정할 수 있습니다. reflection이 구체적인 쓰임중에 하나가 빌더툴을 이용해서 소프트웨어 컴포턴트를 만드는 것입니다. 툴은 reflection을 사용해서 동적으로 로딩되는 자바 컴포턴트(class)의 속성을 가져올 수 있습니다.
'Java 개발 이야기' 카테고리의 다른 글
자바의 객체 비교 Comparable와 Comparator (0) | 2018.04.18 |
---|---|
자바 리플렉션(Reflection) 사용 (0) | 2018.04.17 |
자바 예외처리(Exception handling) (0) | 2017.09.21 |
자바 객체의 직렬화(Serializable, serialVersionUID) (0) | 2017.09.19 |
자바 정규표현식 Pattern, Matcher (0) | 2017.09.18 |