본문 바로가기
Language/Java

[Java API] Class 클래스

by 클레어몬트 2024. 8. 23.

ㅇClass 클래스: Java Reflection API의 중요한 부분으로, JVM에서 클래스, 인터페이스, 배열 등의 메타데이터를 표현하는 역할

Class 객체는 Java의 모든 클래스와 인터페이스에 대해 자동으로 생성되며, 각 클래스와 인터페이스의 런타임 표현을 제공한다. 이를 통해 클래스의 구조, 메서드, 필드, 생성자, 애노테이션 등의 정보에 접근할 수 있다.

다시 정리하면, Class 클래스를 통해 개발자는 실행 중인 자바 애플리케이션 내에서 필요한 클래스의 속성과 메서드에 대한 정보를 조회하고 조작할 수가 있다.

 

[Class 클래스 주요 기능]

- 타입 정보 얻기: 클래스의 이름, 슈퍼클래스, 인터페이스, 접근 제한자 등과 같은 정보를 조회할 수 있다

- 리플렉션(reflection): 클래스에 정의된 메서드, 필드, 생성자 등을 조회하고, 이들을 통해 객체 인스턴스를 생성하거나 메서드를 호출하는 등의 작업을 할 수 있다

- 동적 로딩과 생성: Class.forName() 메서드를 사용하여 클래스를 동적으로 로드하고, newInstance() 메서드를 통해 새로운 인스턴스를 생성할 수 있다

- 애노테이션(annotation) 처리: 클래스에 적용된 애노테이션을 조회하고 처리하는 기능을 제공한다

 

 

예를 들어, String.class String 클래스에 대한 Class 객체를 나타내며, 이를 통해 String 클래스에 대한 메타데이터를 조회하거나 조작할 수 있다.

 

<Class 조회 3가지 방법>

Class clazz = String.class; // 1. 클래스에서 조회
Class clazz = new String().getClass(); // 2. getClass()로 인스턴스에서 조회
Class clazz = Class.forName("java.lang.String"); // 3. forName()으로 패키지명 문자열로 조회

 

(예시 코드)

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 조회 3가지 방법
        Class clazz = String.class; // 1. 클래스에서 String 클래스로 조회
        // Class clazz2 = new String().getClass(); // 2. getClass()로 인스턴스에서 조회
        // Class clazz3 = Class.forName("java.lang.String"); // 3. forName()으로 패키지명 문자열로 조회

        // 모든 필드 출력
        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());
        }
    }
}

.

.

.

 

 

class vs clazz

class는 자바의 예약어다. 따라서 패키지명, 변수명으로 사용할 수 없다. 이런 이유로 자바 개발자들은 class 대신 clazz 라는 이름을 관행으로 사용한다.

 

 

[Class 클래스 주요 메서드]

- getDeclaredFields(): 클래스의 모든 필드를 조회

- getDeclaredMethods(): 클래스의 모든 메서드를 조회

- getSuperclass(): 클래스의 부모 클래스를 조회

- getInterfaces(): 클래스의 인터페이스들을 조회

 

 

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");

        // helloClass가 가진 생성자를 얻어서 인스턴스를 생성한다
        Hello hello = (Hello) helloClass.getDeclaredConstructor().newInstance();
        String result = hello.hello();
        System.out.println("hello = " + hello);
        System.out.println("result = " + result);
    }
}

 

 

ㅇ리플렉션(reflection)
Class를 사용하면 클래스의 메타 정보를 기반으로 클래스에 정의된 메서드, 필드, 생성자 등을 조회하고, 이들을 통해 객체 인스턴스를 생성하거나 메서드를 호출하는 작업을 할 수 있다. 이런 작업을 리플렉션이라 한다. 추가로 애노테이션 정보를 읽어서 특별한 기능을 수행할 수도 있다. 최신 프레임워크들은 이런 기능을 적극 활용한다.

https://claremont.tistory.com/entry/OOP-%EB%A6%AC%ED%94%8C%EB%A0%89%EC%85%98reflection

 

[OOP] 리플렉션(reflection)

ㅇ리플렉션(reflection): OOP에서 런타임에 프로그램의 구조를 검사하고 조작할 수 있는 메커니즘프로그램이 실행 중에 자신에 대한 정보를 탐색하거나, 구조를 동적으로 변경할 수 있다. 예를 들어

claremont.tistory.com