본문 바로가기
JAVA BASE/lang & util

01-5. [자바] getClass(), Class클래스, reflection - Object클래스

by staticClass 2020. 12. 24.

getClass()?

getClass()는 자신이 속한 클래스의 Class객체를 반환하는 메서드이다.
예약어 class가 아닌 클래스의 이름이 Class인 클래스 객체이다.

public final class Class implements ... {  // Class클래스
    ...
}

클래스의 정보가 필요할때 먼저 Class객체에 대한 참조를 얻어와야 하는데 방법은 여러가지가 있다.
getClass()를 이용하여 가지고 오는 방법

Card c = new Card();
Class cObj = c.getClass();            // 생성된 객체로 부터 얻는 방법
Calss cObj = new Card().getClass(); // 위와 동일.
Calss cObj = Card.class;            // 클래스 리터럴(*.class)로 부터 얻는 방법
Calss cObj = Class.forName("Card"); // 클래스 이름으로 부터 얻는 방법

forName()데이터베이스 드라이버를 메모리에 올릴때 주로 사용한다.

import java.lang.reflect.Field;
import java.util.Arrays;

public class ClassTest {
    public static void main(String[] args) throws NoSuchFieldException, SecurityException, ClassNotFoundException {
        String str = "Class클래스 테스트";
        Class cObj = str.getClass();
        System.out.println("1. "+cObj.getSimpleName());      // 클래스의 이름만 호출한다.
        System.out.println("2. "+cObj.getPackageName());  // 패키지의 이름을 호출한다.
        System.out.println("3. "+cObj.getName());          // 패키지와 이름을 호출한다.
        System.out.println("4. "+cObj.toString());          // 클래스 패키지 이름을 호출한다.
        System.out.println("5. "+cObj.toGenericString()); // 제어자부터 패키지 이름 모두다 호출한다.


        System.out.println("----------------------------------------------------------------------------------");

        Card c = new Card();         //String kind, int number, int width, int hight 를 가진 객체
        Class cObj2 = c.getClass(); //의 정보를 Class 클래스에 참조

        // Field 를 사용하려면 import java.lang.reflect.Field; 임포트를 해야한다.
        Field[] field = cObj2.getFields(); //getFields()는 public인 필드만 가지고 올수 있다.
        System.out.println(Arrays.toString(field));

        Field[] field2 = cObj2.getDeclaredFields(); // 제어자에 상관없이 모든 필드를 가지고 온다.
        System.out.println(Arrays.toString(field2));
    }
}
// 결과
// 1. String
// 2. java.lang
// 3. java.lang.String
// 4. class java.lang.String
// 5. public final class java.lang.String
// ----------------------------------------------------------------------------------
// [public java.lang.String example.Card.kind, public int example.Card.number]
// [public java.lang.String example.Card.kind, public int example.Card.number, int example.Card.width, int example.Card.hight]

위와 같이 클래스의 정보를 호출 할 수 있고 위에 적혀 있는 메소드보다 더 다양한 메소드가 존재한다.
이 외에도 생성자, 어노테이션, 메소드, 제네릭 등등 정말 아주 많은 정보들을 반환 받을수 있다.
더 많은 것들이 궁금하다면 리플렉션 API(reflection API)를 검색해보자.

 

댓글