[Java] Class 클래스

Yujeong·2024년 5월 23일
0

Java

목록 보기
7/22
post-thumbnail

Class 클래스는 클래스의 정보(메타 데이터, meta data)를 다루는데 사용된다. Class 클래스를 실행중인 자바 애플리케이션 내에서 필요한 클래스의 속성과 메서드에 대한 정보를 조회 및 조작할 수 있다.

Class 클래스 주요 기능

  • 타입 정보 얻기
    • 클래스의 이름, 슈퍼클래스, 인터페이스, 접근 제한자 등과 같은 정보 조회
  • 리플렉션(reflection)
    • 클래스에 정의된 메서드, 필드, 생성자 조회
    • 조회한 정보를 통해 객체 인스턴스 생성 또는 메서드 호출
  • 동적 로딩과 생성
    • Class.forName() 메서드로 클래스를 동적으로 로드하고, newInstance() 메서드로 새로운 인스턴스 생성
  • 애노테이션 처리
    • 클래스에 적용된 애노테이션(annotation)을 조회 및 처리
메서드설명예외처리
forName(String className)지정한 이름의 클래스를 로드한다.ClassNotFoundException
newInstance()클래스의 기본 생성자를 사용하여 새로운 인스턴스를 생성합니다.
(Java 9부터는 사용 권장되지 않음)
InstantiationException, IllegalAccessException
getName()클래스의 이름을 반환합니다.
패키지 경로를 포함한 정규 클래스 이름을 반환합니다.
getSimpleName()클래스의 간단한 이름을 반환합니다.
패키지 경로를 제외한 클래스 이름을 반환합니다.
getSuperclass()클래스의 슈퍼클래스를 반환합니다.
Object 클래스의 경우 null을 반환합니다.
getMethods()현재 클래스 및 슈퍼클래스의 모든 public 메서드를 반환합니다.SecurityException
getDeclaredMethods()현재 클래스에 선언된 모든 메서드를 반환합니다.
접근 제어자에 관계없이 모든 메서드를 반환합니다.
SecurityException
getFields()현재 클래스 및 슈퍼클래스의 모든 public 필드를 반환합니다.SecurityException
getDeclaredFields()현재 클래스에 선언된 모든 필드를 반환합니다.
접근 제어자에 관계없이 모든 필드를 반환합니다.
SecurityException
getConstructors()현재 클래스의 모든 public 생성자를 반환합니다.SecurityException

1. 메타 데이터 조회

예시로 String 클래스의 메타데이터를 조회해보자.

public class ClassMetaDataMain {
	public static void main(String[] args) throws Exception {
    	// 1. Class 조회
    	// 1-1.클래스에서 조회
    	Class clazz1 = String.class;
        // 1-2. 인스턴스에서 조회
        Class clazz2 = new String().getClass();
        // 1-3. 문자열로 조회
        Class clazz3 = Class.forName("java.lang.String");
        
        // 2. 모든 필드 조회
        Field[] fields = clazz1.getDeclaredFields();
        for (Field field : fields) {
        	System.out.println(field.getType() + ", " + field.getName()); 
        }
        
        // 3. 모든 메서드 조회
        Method[] methods = clazz1.getDelcaredMethods();
        for (Method method : methods) {
        System.out.println(method);
        }
        
        // 4. 상위 클래스 정보 조회
        System.out.println(clazz1.getSuperclass().getName());
        
        // 5. 인터페이스 정보 조회
        Class[] interfaces = clazz1.getInterfaces();
        for (Class interface : interfaces) {
        	System.out.println(interface.getName());
        }
    }
}
  • Class.forName()을 사용하면 ClassNotFoundException이 발생할 수도 있기 때문에 throws ClassNotFoundException 또는 throws Exception이 필요하다.

2. 클래스와 인스턴스 생성

클래스를 생성하고 클래스의 메타데이터를 조회하여 인스턴스를 생성해보자.

public class Book {
	public String getBook() {
    	return "Book{Author: Hermann Hesse, Title: Demian}";
    }
}
public class ClassCreateMain {
	public static void main(String[] args) throws Exception {
    	// 1. 클래스 조회
        // 1-1. 클래스에서 조회
        Class<Book> bookClass1 = Book.class;
        // 1-2. 문자열로 조회
        Class bookClass2 = Class.forName("lang.clazz.Book");

		// 2. 생성자를 얻어서 객체 생성
        // 2-1. Class 객체 이용
        Book book1 = (Book) bookClass1.getDeclaredConstructor().newInstance();
        // 2-2. new 연산자 사용
        Book book2 = (Book) new Book();
        
        String result = book1.getBook();
        System.out.println(result);
    }
}
  • newInstance()를 사용하면 InstantiationException 또는 IllegalAccessException이 발생할 수 있으므로 예외처리를 해야한다.

참고
Class Class
김영한의 실전 자바 - 중급 1편

profile
공부 기록

0개의 댓글

관련 채용 정보