article thumbnail image
Published 2020. 5. 1. 16:35

java.lang.Object 클래스는 Java에서 만드는 모든 클래스들의 root 이며, 따라서 모든 클래스들은 java.lang.Object를 superclass로 갖고 태어난다. Object 클래스의 구현을 보면 @since JDK1.0로 주석이 달려있다. JDK의 시작부터 함께해왔던 클래스인만큼, Java로 애플리케이션을 만든다면 Object 클래스에 대해서 파악해둘 필요성이 있을 것이다.


getClass() 메서드

java.lang의 Object 클래스 중에서 getClass() 메소드에 대해 알아보자.
현재 참조하고 있는 클래스를 확인할 수 있는 메소드이다.
A라는 클래스를 참조하고 있다면 class A 라는 값이 출력된다.

객체 타입을 확인하는데 쓰이는 instanceof 와 함께 알아두면 유용하다.

classes 라는 패키지 안에 A,B 클래스를 참조하고 있음을 알 수 있다.


 

위 예제 코드를 보면 빨간색 네모 부분이 "getClass" 메쏘드를 사용한 모습이다.

리턴 값으로 "Class" 클래스의 객체로 주는데, "cls" 에 담아서 사용해보자.

녹색 네모 부분을 보면 "Class" 클래스는 각종 정보를 메쏘드로 제공해주고 있다.
"getName()" 메쏘드는 해당 객체의 이름을 제공한다.
"getSuperclass()" 메쏘드는 해당 객체의 상위 클래스 이름을 알려준다.
"getDeclaredFields()" 메쏘드는 해당 객체의 선언된 필드 정보를 배열 형태로 전달해준다.

이것 말고도 여러가지 정보를 메쏘드로 제공해준다.

student1 객체로 "getClass()" 메쏘드를 실행하면 student1 정보를 담은 "Class"객체를 리턴값으로 전달한다.
이 "Class" 객체인 "cls"는 각종 메쏘드를 통하여 student1의 정보를 알려준다.


Class 객체 얻기 getClass(), forName()

프로그램에서 Class 객체를 얻기 위해서는 Object 클래스의 getClass() 메서드를 이용하면 된다.
모든 클래스에서 getClass() 메서드를 호출할 수 있다.
Class clazz = obj.getClass();

getClass() 메서드는 해당 클래스로 객체를 생성했을 때만 사용할 수 있다.
객체를 생성하기 전에 직접 Class 객체를 얻을 수도 있다.
Class는 생성자를 감추고 있기 때문에 new 연산자로 객체를 만들 수 없고
정적 메서드는 forName()을 이용해야 한다.
forName() 메서드는 클래스 전체 이름(패키지가 포함된 이름) 을 매개값으로 받고 Class 객체를 리턴한다.


String getName(): 클래스의 이름을 리턴한다.

Package getPackage(): 클래스의 패키지 정보를 패키지 클래스 타입으로 리턴한다.

Field[] getFields(): public으로 선언된 변수 목록을 Field 클래스 배열 타입으로 리턴한다.

Field getField(String name): public으로 선언된 변수를 Field 클래스 타입으로 리턴한다.

Field[] getDeclaredFields(): 해당 클래스에서 정의된 변수 목록을 field 클래스 배열 타입으로 리턴한다.

Field getDeclaredField(String name): name과 동일한 이름으로 정의된 변수를 Field 클래스 타입으로 리턴한다.

Method[] getMethods(): public으로 선언된 모든 메소드 목록을 Method 클래스 배열 타입으로 리턴한다. 해당 클래스에서 사용 가능한 상속받은 메소드도 포함된다.

Method getMethod(String name, Class... parameterTypes): 지정된 이름과 매개변수 타입을 갖는 메소드를 Method 클래스 타입으로 리턴한다.

Method[] getDeclaredMethods(): 해당 클래스에서 선언된 모든 메소드 정보를 리턴한다.

Method getDeclaredMethod(String name, Class... parameterTypes): 지정된 이름과 매개변수 타입을 갖는 해당 클래스에서 선언된 메소드를 Method 클래스 타입으로 리턴한다.

Constructor[] getConstructors(): 해당 클래스에 선언된 모든 public 생성자의 정보를 Constructor 배열 타입으로 리턴한다.

Constructor[] getDeclaredConstructors(): 해당 클래스에서 선언된 모든 생성자의 정보를 Constructor 배열 타입으로 리턴한다.

int getModifiers(): 해당 클래스의 접근자(modifier) 정보를 int 타입으로 리턴한다.

String toString(): 해당 클래스 객체를 문자열로 리턴한다.

 

https://12bme.tistory.com/129


java.lang.Object.getClass()

java.lang.Object의 getClass()에 대해 알아보자.
getClass() 메서드는 다음과 같이 선언되어 있다.

public final native Class getClass();

 

Object 클래스 API 문서의 getClass 메서드 항목를 보면 '이 Object의 runtime class를 돌려준다'고 되어 있다. runtime class에 대해 확인해보기 위해 예제를 만들어보자. 만약 A라는 클래스에 getClass()를 사용하는 b라는 메서드가 있다고 가정하고 A를 상속받은 클래스에서 superclass인 A의 b 메서드를 호출하도록 작성해보자.

package study.hard.javalib.nativelib; public class GetClassTest { public static void main(String[] args) { GetClassTest tester = new GetClassTest(); ExtendedClassA extendedA = tester.new ExtendedClassA(); extendedA.printClass(); } public class ClassA { public void printThisClass() { System.out.println(getClass()); } } public class ExtendedClassA extends ClassA { public void printClass() { printThisClass(); } } } 


위 코드의 결과는 아래와 같다.

class study.hard.javalib.nativelib.GetClassTest$ExtendedClassA 


inner class로 구현한 클래스를 사용한지라 점 대신 $ 기호 뒤에 클래스 이름이 보인다. 분명히 superclass인 ClassA의 메서드에서 getClass()메서드를 사용했지만, runtime 시에 최초 호출한 ExtendedClassA의 이름이 출력되는 것을 확인할 수 있다. getClass() 메서드가 리턴하는 결과는 java.lang.Class 인데, 이는 실행중인 자바 애플리케이션의 클래스나 인터페이스들의 정보를 담고 있는 클래스이다. java.lang.Class의 toString() 메서드는 아래와 같이 구현되어 있고, 따라서 위와 같이 class라는 문자열 뒤에 getName()의 결과가 출력된다.



'📌 java > java' 카테고리의 다른 글

java - inner class (자바의 정석)  (0) 2020.05.13
java - Inner Class  (0) 2020.05.13
java - Object 클래스  (0) 2020.04.30
java - throw new  (0) 2020.04.29
java - throw & throws  (0) 2020.04.28
복사했습니다!