Class 클래스
`Class` 클래스는 자바 리플렉션 API의 일부로, 클래스 및 인터페이스의 메타데이터에 접근할 수 있도록 한다. `Class` 객체는 특정 클래스에 대한 정보를 캡슐화하며, 클래스 이름, 상위 클래스, 구현한 인터페이스, 메서드, 생성자 등의 정보를 제공한다.
Class 조회
다음과 같이 3가지 방법을 통한 조회가 가능하다.
Class clazz = String.class; // 1.클래스에서 조회
Class clazz = new String().getClass();// 2.인스턴스에서 조회
Class clazz = Class.forName("java.lang.String"); // 3.문자열로 조회
조회된 `Class`클래스의 객체를 이용한 주요 기능은 다음과 같다.
- `getDeclaredFields()` : 클래스의 모든 필드를 조회한다.
- `getDeclaredMethods()` : 클래스의 모든 메서드를 조회한다.
- `getSuperclass()` : 클래스의 부모 클래스를 조회한다.
- `getInterfaces()` : 클래스의 인터페이스들을 조회한다.
`String`클래스의 `Class`정보를 조회하는 예시이며, 실행결과를 보면 `String`클래스의 메타데이터를 정보를 확인할 수 있다.
package lang.clazz;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ClassMetaMain {
public static void main(String[] args) throws Exception {
//Class 조회
Class clazz = String.class; // 1.클래스에서 조회
//Class clazz = new String().getClass();// 2.인스턴스에서 조회
//Class clazz = Class.forName("java.lang.String"); // 3.문자열로 조회
// 모든 필드 출력
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
System.out.println("Field: " + field.getType() + " " +
field.getName());
}
// 모든 메서드 출력
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
System.out.println("Method: " + method);
}
// 상위 클래스 정보 출력
System.out.println("Superclass: " + clazz.getSuperclass().getName());
// 인터페이스 정보 출력
Class[] interfaces = clazz.getInterfaces();
for (Class i : interfaces) {
System.out.println("Interface: " + i.getName());
}
}
}
[실행결과]
Field: class [B value
...
Method: public boolean java.lang.String.equals(java.lang.Object)
Method: public int java.lang.String.length()
...
Superclass: java.lang.Object
Interface: java.io.Serializable
Interface: java.lang.Comparable
...
클래스 생성하기
`Class` 클래스에는 클래스의 모든 정보가 들어있다. 이 정보를 기반으로 인스턴스를 생성하거나, 메서드를 호출하고,
필드의 값도 변경할 수 있다.
다음은 `Class`클래스를 이용해 간단한 인스턴스를 만드는 예제이다.
package lang.clazz;
public class Hello {
public String hello() {
return "hello!";
}
}
package lang.clazz;
public class ClassCreateMain {
public static void main(String[] args) throws Exception {
//Class helloClass = Hello.class;
Class helloClass = Class.forName("lang.clazz.Hello");
Hello hello = (Hello) helloClass.getDeclaredConstructor().newInstance();
String result = hello.hello();
System.out.println("result = " + result);
}
}
result = hello!
코드를 보면 `getDeclaredConstructor().newInstance()`라는 명령어를 이용해 `Hello`인스턴스가 생성되는 걸 알 수 있다.
- `getDeclaredConstructor()` : 생성자를 선택한다.
- `newInstance()` : 선택된 생성자를 기반으로 인스턴스를 생성한다.
리플렉션?
`Class`객체를 이용하면 특정 클래스의 생성자, 필드, 메소드 정보 등을 알아낼 수 있으며, 이를 통해 객체 인스턴스를 생생하거나 메서드를 호출하는 작업을 할 수 있다.
이것을 리플렉션(Reflection)이라고 한다.
추가로 리플렉션은 애노테이션의 정보를 읽어서 특별한 기능을 수행할 수 있으며, 주로 자바와 함께 사용되는 프레임워크인 스프링에서도 이런 기능을 적극적으로 활용하고 있다.
정리
Class 클래스는 자바의 리플렉션 기능을 활용하여 클래스의 메타데이터에 접근하고 조작할 수 있도록 하는 도구이다. 이를 통해 개발자는 런타임에 클래스 정보를 조회하거나, 객체를 동적으로 생성하고, 필드 값을 변경하거나, 메서드를 호출하는 등의 작업을 수행할 수 있다.
클래스와 리플렉션의 연관성
- `Class` 클래스는 특정 클래스의 구조(필드, 메서드, 생성자 등)를 메타데이터 형태로 저장하고 제공한다.
- 리플렉션을 활용하면 런타임에 클래스 정보를 동적으로 확인하고, 직접 객체를 조작할 수 있다.
- 주로 프레임워크(Spring, Hibernate 등)나 DI(의존성 주입)과 같은 기술에서 객체의 동적 생성 및 조작을 위해 사용된다.
클래스를 사용하는 이유
- 코드의 유연성 증가: 컴파일 타임이 아닌 런타임에 객체를 생성하고 조작할 수 있어 동적인 프로그램 개발이 가능하다.
- 프레임워크에서 필수적인 역할: 스프링 프레임워크의 빈(Bean) 관리, ORM에서의 엔티티 분석 등 다양한 기능이 리플렉션을 기반으로 동작한다.
- 애노테이션과 결합한 메타프로그래밍: 애노테이션 정보를 활용하여 특정 기능(예: 자동 의존성 주입, ORM 매핑)을 수행하는 데 사용된다.
추가적으로 리플렉션에 대해서는 더 방대한 내용이 있기 때문에 후에 정리하도록 하자!!
'Language > Java' 카테고리의 다른 글
[Java] 제네릭(Generic) (1) | 2025.01.31 |
---|---|
[Java] 자바 예외 처리 - 예외 계층, 체크 예외, 언체크 예외, 예외의 규칙 (0) | 2025.01.31 |
[Java] 클래스 로더 (Class Loader)와 로딩 과정 (1) | 2025.01.29 |
[Java] Wrapper 클래스와 성능(오토 박싱 & 오토 언박싱) (0) | 2025.01.23 |
[Java] 불변객체 - String과 성능(StirngBuilder vs StringBuffer) (1) | 2025.01.22 |