본문 바로가기

Java

[Java] Class 클래스??

자바에서는 Class 클래스는 클래스의 정보(메타데이터)를 다루는데 사용됩니다.

Class 클래스를 통해 개발자는 실행 중인 자바 애플리케이션 내에서 필요한 클래스의 속성과 메서드에 대한 정보를

조회하고 조작할 수 있습니다.

 

Class 클래스의 주요 기능

  • 타입 정보 얻기: 클래스의 이름, 슈퍼 클래스, 인터페이스, 접근 제한자 등과 같은 정보를 조회할 수 있다.
  • 리플렉션: 클래스에 정의된 메소드,필드,생성자 등을 조회하고, 이들을 통해 객체 인스턴스를 생성하거나 메소드를 호출하는 등의 작업을 할 수 있다.
  • 동적 로딩과 생성: Class.forName( ) 메서드를 사용하여 클래스를 동적으로 로드하고, newInstance( ) 메서드를 통해 새로운 인스턴스를 생성할 수 있다.
  • 애노테이션 처리: 클래스에 적용된 애노테이션(annotation)을 조회하고 처리하는 기능을 제공한다.
public class ClassMetaMain {

    public static void main(String[] args) throws ClassNotFoundException {
        // 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 anInterface : interfaces) {
            System.out.println("anInterface = " + anInterface);
        }
    }
}
  • 자바의 예약어는 패키지명, 변수명으로 사용할 수 없다.
  • main( ) 옆에 throws Exception을 추가하지 않으면 컴파일 오류가 발생한다.

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( ) : 클래스의 인터페이스들을 조회한다.

 

클래스 생성하기

Class 클래스에는 클래스의 모든 정보가 들어있습니다.

이 정보를 기반으로 인스턴스를 생성하거나 메서드를 호출하고 필드의 값도 변경할 수 있습니다.

package lang.clazz;

public class Hello {
    
    public String hello() {
        return "hello!";
    }
}
public class ClassCrateMain {

    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()

  • getDeclaredConstructor( ) : 생성자를 선택한다.
  • newInstance( ) : 선택된 생성자를 기반으로 인스턴스를 생성한다.
리플렉션 - reflection

Class를 사용하면 클래스의 메타 정보를 기반으로 클래스에 정의된 메서드, 필드, 생성자 등을 조회하고, 이들을 통해

객체 인스턴스를 생성하거나 메소드를 호출하는 작업을 할 수 있습니다. 이런 작업을 리플렉션이라고 합니다.

추가로 애노테이션 정보를 읽어서 특별한 기능을 수행할 수 도 있습니다. 최신 프레임워크들은 이런 기능을 적극 활용합니다. 

 

 

 

'Java' 카테고리의 다른 글

[Java] Math, Random 클래스  (0) 2024.04.11
[Java] System 클래스  (0) 2024.04.11
[Java] Wrapper class  (0) 2024.04.05
[Java] 가변 String  (1) 2024.04.04
[Java] String 클래스 주요 메서드를 살펴보자!  (0) 2024.04.02