Java 기초 Class
자바의 "Class" 클래스는 메타데이터 정보를 다루는 용도로 사용한다. 실행 중인 자바에서 필요한 속성과 메소드에 대한 정보를 조회하고 조작한다.
주요 기능
- 타입 정보 얻기
- 클래스 이름, 슈퍼 클래스, 인터페이스 , 접근 제한자 등 정보를 조회한다.
- 리플렉션
- 정의된 클래스 메소드, 필드, 생성자 등을 조회한다.
- 객체 인스턴스 생성하거나 메소드 호출 작업을 한다.
- 동적 로딩과 생성
- 클래스 동적 로드를 Class.forName() 메소드로 사용한다.
- newInstance 메소드로 새로운 인스턴스를 생성한다.
- 애노테이션 처리
- 클래스에 적용된 애노테이션(annotation) 조회하고 처리 기능을 제공한다.
예시로 String.class 사용하는 경우 String 클래스에 대한 정보의 Class 객체를 나타나고 String 클래스에 대한 메타데이터 조회하거나 조작한다.
Class 정의하기
public class Main {
public static void main(String[] args) throws Exception{
Class<String> stringClass = String.class;
Class stringClass2 = String.class; // 1. 클래스에서 조회
Class stringClass3 = new String().getClass(); // 2. 인스턴스에서의 조회
Class stringClass4 = Class.forName("Java.lang.String"); // 3. 문자열로 조회
}
}
Class 타입으로 선언하여 String.class 타입의 클래스를 할당한다.
클래스에서 조회 말고 인스턴스 생성으로 조회하거나 문자열로 조회할 수 있다.
Class 사용하기 - 필드 출력
// 1. 클래스에서 조회
Class stringClass2 = String.class;
// String 클래스 모든 필드 출력하기
Field[] declaredFields = stringClass2.getDeclaredFields();
for (Field field : declaredFields) {
System.out.println("field = " + field);
}
field = private final byte[] java.lang.String.value
field = private final byte java.lang.String.coder
field = private int java.lang.String.hash
field = private boolean java.lang.String.hashIsZero
field = private static final long java.lang.String.serialVersionUID
field = static final boolean java.lang.String.COMPACT_STRINGS
field = private static final java.io.ObjectStreamField[] java.lang.String.serialPersistentFields
field = private static final char java.lang.String.REPL
field = public static final java.util.Comparator java.lang.String.CASE_INSENSITIVE_ORDER
field = static final byte java.lang.String.LATIN1
field = static final byte java.lang.String.UTF16
String 클래스에 대한 필드에 대한 정보들이 모두 출력된다.
정보가 너무 많은 경우 줄여서 출력해보도록 한다.
Class stringClass2 = String.class; // 1. 클래스에서 조회
// String 클래스 모든 필드 출력하기
Field[] declaredFields = stringClass2.getDeclaredFields();
for (Field field : declaredFields) {
System.out.println("field = " + field.getType() + " " + field.getName());
}
field = class [B value
field = byte coder
field = int hash
field = boolean hashIsZero
field = long serialVersionUID
field = boolean COMPACT_STRINGS
field = class [Ljava.io.ObjectStreamField; serialPersistentFields
field = char REPL
field = interface java.util.Comparator CASE_INSENSITIVE_ORDER
field = byte LATIN1
field = byte UTF16
Class 사용하기 - 메소드 출력
Class stringClass = String.class; // 1. 클래스에서 조회
// String 클래스 모든 메소드 출력
Method[] declaredMethods = stringClass.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) {
System.out.println("method = " + declaredMethod);
method = byte[] java.lang.String.value()
method = public boolean java.lang.String.equals(java.lang.Object)
method = public int java.lang.String.length()
method = public java.lang.String java.lang.String.toString()
method = static void java.lang.String.checkIndex(int,int)
method = public int java.lang.String.hashCode()
...
getDeclaredMethods 조회하여 String의 모든 메소드가 출력되었다.
String에서 사용한 valudOf(), replace() 등 살펴볼 수 있다.
Class 사용하기 - 슈퍼 클래스 조회
// 1. 클래스에서 조회
Class stringClass = String.class;
// String 상위 클래스 조회
System.out.println(stringClass.getSuperclass().getName());
java.lang.Object
String의 상위 클래스인 Object가 출력한 것을 볼 수 있다.
Class 사용하기 - 인터페이스 조회
// 1. 클래스에서 조회
Class stringClass = String.class;
// 인터페이스 모두 조회하기
Class[] interfaces = stringClass.getInterfaces();
for (Class anInterface : interfaces) {
System.out.println("Interface: " + anInterface.getName());
}
Interface: java.io.Serializable
Interface: java.lang.Comparable
Interface: java.lang.CharSequence
Interface: java.lang.constant.Constable
Interface: java.lang.constant.ConstantDesc
String 클래스에서 인터페이스로 된 정보를 출력할 수 있다.
Class 사용하기 - 정리
주요 기능
- getDeclaredFields()
- 클래스의 필드 조회
- getDeclaredMethods()
- 클래스의 모든 메소드 조회
- getSuperclass()
- 클래스의 부모 클래스 조회
- getInterfaces()
- 클래스의 인터페이스 조회