Java

[Java]Object 클래스의 getClass 메서드

DevStory 2022. 9. 3.

Object 클래스의 getClass 메서드

java.lang 패키지에 존재하는 Object 클래스의 getClass() 메서드를 사용하면, 실행 중인 클래스 객체의 정보를 가져올 수 있습니다.

public final native Class<?> getClass();

getClass() 메서드의 반환 결과는 실행 중인 객체의 클래스 정보를 가지고 있는 Class 객체입니다.

 

먼저, 런타임 클래스와 런타임 클래스 객체가 무엇인지 알아봅시다.

 

런타임 클래스(Runtime class)

- 실행 시 JVM에 로드되는 클래스를 런타임 클래스라고 말합니다.

 

런타임 클래스 객체(Runtime class object)

- 모든 클래스 바이트 코드는 java.lang 패키지의 Class 객체를 사용하여 저장됩니다. Class 클래스의 인스턴스를 런타임 클래스 객체라고 말합니다.

※  바이트 코드(Byte Code)
.java 파일은 JVM이 이해하지 못합니다. 소스 코드를 컴파일하면, .java 파일에 작성한 소스 코드를 JVM이 이해할 수 있도록 .class 파일로 변환하는데, .class 파일에 존재하는 데이터가 바이트 코드입니다.

즉, JVM은 .class 파일에 존재하는 바이트 코드를 사용하여 .java 파일에 작성한 소스 코드를 이해합니다.

모든 .class 파일이 로드되면, JVM은 힙 영역에 Class 타입의 객체를 하나 생성합니다. 이 객체를 사용하여 클래스 이름, 메서드 정보, 생성자 정보 등 클래스에 대한 정보를 얻을 수 있습니다.

 

예를 들어, 다음 소스 코드처럼 사용자가 정의한 클래스인 Person 타입의 객체가 있습니다. Java의 모든 클래스는 최상위 클래스인 Object에서 파생되므로 Person 클래스의 인스턴스에서 getClass() 메서드를 사용할 수 있습니다. 따라서, getClass() 메서드를 사용하여 런타임 클래스 객체를 가져올 수 있습니다.

public static void main(String args[]) {
  Person person = new Person();
  System.out.println(person.getClass());
}

[실행 결과]

class Person

 

위에서 언급했듯이 Java의 모든 클래스는 최상위 클래스인 Object에서 파생되므로 Java에서 제공하는 클래스 인스턴스에서 getClass() 메서드를 사용할 수 있습니다.

public static void main(String args[]) {
  String str = new String();
  System.out.println(str.getClass());

  ArrayList<Integer> al = new ArrayList<>();
  System.out.println(al.getClass());

  HashMap<String, Integer> hm = new HashMap<>();
  System.out.println(hm.getClass());
}

[실행 결과]

class java.lang.String
class java.util.ArrayList
class java.util.HashMap

클래스 이름 가져오기

클래스의 이름을 가져오려면 런타임 클래스 객체에서 getName() 메서드를 호출합니다. 위에서 런타임 클래스 객체는 Class 클래스의 인스턴스라고 말했습니다. 따라서, getName() 메서드는 java.lang.Class에 정의되어 있습니다.

 

다음 예제는 선언된 객체에서 getClass() 메서드를 호출 후 getName() 메서드를 호출합니다.

public static void main(String args[]) {
  String str = new String();
  System.out.println(str.getClass().getName());

  ArrayList<Integer> al = new ArrayList<>();
  System.out.println(al.getClass().getName());

  HashMap<String, Integer> hm = new HashMap<>();
  System.out.println(hm.getClass().getName());
}

[실행 결과]

java.lang.String
java.util.ArrayList
java.util.HashMap

다음 예제처럼 getClass() 메서드 반환 결과를 Class 객체에 할당 후 getName() 메서드를 호출할 수 있습니다.

public static void main(String args[]) {
  String str = new String();
  Class strClass = str.getClass();
  System.out.println(strClass.getName());

  ArrayList<Integer> al = new ArrayList<>();
  Class alClass = al.getClass();
  System.out.println(alClass.getName());

  HashMap<String, Integer> hm = new HashMap<>();
  Class hmClass = hm.getClass();
  System.out.println(hmClass.getName());
}

[실행 결과]

java.lang.String
java.util.ArrayList
java.util.HashMap

getClass 메서드를 사용하여 클래스 정보 가져오기

getClass() 메서드를 사용하여 클래스에 대한 자세한 정보를 확인할 수 있습니다.

 

getFileds()

- 클래스의 필드를 반환합니다.

 

getConstructors()

- 클래스의 생성자를 반환합니다.

 

getMethods()

- 클래스의 메서드를 반환합니다.

 

이번 포스팅은 getClass() 메서드에 대해 설명하는 것이 목적이므로 위 세 개의 메서드를 사용하는 방법은 생략합니다.

 

getFileds(), getConstructors(), getMethods() 메서드 사용 방법은 아래 포스팅에서 확인할 수 있습니다.

 

[Java]리플렉션(Reflection)

리플렉션(Reflection)이란? 우리가 작성한 소스코드가 프로그램이 되기까지 컴파일러는 컴파일 타임에 소스코드가 문제없는지 확인합니다. 일반적으로 객체의 타입을 모르는데 특정 클래스의 메

developer-talk.tistory.com


런타임 클래스 객체를 가져오는 방법

런타임 클래스 객체를 가져오는 방법은 세 가지 방법이 존재합니다.

 

첫 번째 방법으로 클래스 이름 뒤에 class를 사용하여 런타임 클래스 객체를 가져올 수 있습니다.

public static void main(String args[]) {
  Class cl = Person.class;
}

 

두 번째 방법으로 Class 클래스에서 제공하는 forName() 메서드에 클래스 이름을 문자열로 전달합니다. 이 방법은 해당 클래스가 존재하지 않으면, ClassNotFoundException이 발생하므로 예외 처리가 필요합니다.

public static void main(String args[]) throws ClassNotFoundException {
  Class cl = Class.forName("Person");
}

 

세 번째 방법으로 이번 포스팅에서 소개한 getClass() 메서드를 호출하여 런타임 클래스 객체를 가져올 수 있습니다.

public static void main(String args[]) {
  Class cl = new Person().getClass();
}
반응형

댓글