[java] 내장 객체와 리플렉션

자바에서는 내장 클래스들을 사용하여 특정 자료형에 대한 정보를 가져오거나 조작할 수 있습니다. 이러한 기능을 리플렉션이라고 합니다. 리플렉션을 사용하면 실행 시간에 클래스의 정보를 검사하거나 수정할 수 있어서 다양한 유연한 프로그래밍이 가능해집니다.

내장 객체

자바 내장 객체에는 Class, Field, Method, Constructor 등이 있습니다. 이들을 이용하여 클래스의 정보를 조사하거나 조작할 수 있습니다.

Class 객체

Class 객체는 클래스의 메타데이터를 나타내며 클래스에 대한 정보를 얻을 수 있습니다. 이 객체를 사용하여 클래스의 이름, 수퍼클래스, 인터페이스, 멤버 함수, 필드 등을 조사할 수 있습니다.

class Dog {
  // 클래스 내용
}

Class<?> dogClass = Dog.class;
System.out.println(dogClass.getName()); // "Dog"
Class<?> superClass = dogClass.getSuperclass();
System.out.println(superClass.getName()); // "Object"

Field 객체

Field 객체는 클래스의 필드에 대한 정보를 나타내며 필드의 이름, 자료형, 접근 지정자 등을 얻을 수 있습니다.

Field[] fields = Dog.class.getDeclaredFields();
for (Field field : fields) {
    System.out.println(field.getName() + " - " + field.getType());
}

Method 객체

Method 객체는 클래스의 메소드에 대한 정보를 나타내며 메소드의 이름, 반환 형식, 매개변수 정보 등을 얻을 수 있습니다.

Method[] methods = Dog.class.getMethods();
for (Method method : methods) {
    System.out.println(method.getName());
}

리플렉션 활용

리플렉션을 사용하면 실행 시간에 클래스의 정보를 조사하거나 수정할 수 있습니다. 예를 들어, 특정 클래스의 메소드나 필드 이름을 동적으로 가져와서 사용할 수 있습니다.

Class<?> cls = Class.forName("com.example.Dog");
Object obj = cls.getDeclaredConstructor().newInstance();

Field field = cls.getDeclaredField("name");
field.setAccessible(true);
field.set(obj, "Buddy");

Method method = cls.getDeclaredMethod("bark");
method.invoke(obj);

리플렉션은 강력한 기능이지만 남용하면 성능 문제나 안정성 문제를 일으킬 수 있기 때문에 주의해서 활용해야 합니다.

결론

리플렉션을 통해 자바의 내장 객체를 활용하면 실행 시간에 클래스의 정보를 동적으로 처리할 수 있습니다. 이는 프레임워크나 라이브러리에서 많이 사용되며, 메타프로그래밍 등의 고급 기술을 구현하는 데에 활용될 수 있습니다.

관련 참고 자료: Oracle Java Documentation