2021-01-26
객체명만 가지고는 해당 객체가 어느 클래스에 속하는지 종종 한 번에 파악하기 어려운 경우가 있다. 이러한 경우에는 Object 클래스가 가지고 있는 getClass와 같은 메서드를 사용하면 유용한데, 이를 사용하는 방법을 알아보자.
package ClassGetName;
public class Student {
private String name;
private String sex;
public Student() {
}
public Student(String name, String sex) {
this.name = name;
this.sex = sex;
}
@Override
public String toString() {
return "이름은 " +name + "이고 성별은 " + sex + "입니다. ";
}
}
예제로 사용한 Studnet 클래스이다. 필드 값은 이름과 성별이 있으면 생성자를 통해서 초기화시킬 수 있도록 코드를 작성하였다.
package ClassGetName;
public class main {
public static void main(String[] args) {
Student student = new Student();
//학생객체 생성
System.out.println(student.getClass());
Class clazz = student.getClass();
//학생객체의 정보를 받는 클래스 객체 생성
System.out.println(clazz.getName());
System.out.println(clazz.getPackage().getName());
System.out.println(clazz.getSimpleName());
}
}
첫 번째 출력문은 단순 Student 클래스의 getClass를 이용해 Class정보를 출력할 수 있게 했으며, 나머지 3가지의 출력문은 직접 Class 객체를 얻어 출력하는 방식을 진행하였다. 메서드 이름에서도 알 수 있듯이 getName은 package정보와 클래스의 이름 모두를 가져오고, getPackage는 패키지 정보만 가져오기 때문에 뒤에 따로 다시 getName을 붙여 패키지 이름만 리턴해주어야 한다. 마지막으로 getSimpleName은 클래스 이름만 추출해 리턴하는데, 아래 결과로 확인할 수 있다.
(클래스 변수명 clazz는 관례적으로 많이 사용한다.)
package ClassGetName;
public class main {
public static void main(String[] args) {
System.out.println("____________클래스가 없을 경우를 대비한 try catch 문_______________");
try {
Class clazz2 = Class.forName("ClassGetName.Student");
//존재하지 않을 클래스명을 입력하면 catch 문으로 이동한다.
//(궁금하면, Student 뒤에 아무 문자나 붙여보자)
System.out.println(clazz2.getName());
System.out.println(clazz2.getPackage().getName());
System.out.println(clazz2.getSimpleName());
}catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
물론 Student 클래스의 객체를 생성하지 않고도 Class를 얻을 수 있는 방법이 있다. 처음 클래스 객체를 만들어 줄 때 forName 메서드를 활용해 해당 클래스의 패키지와 클래스명은 ' . '으로 나누어서 매개 변수로 넣어주면 된다. 다만 클래스가 존재하지 않을 경우 발생하는 ClassNotFoundException를 대비하여 try / catch 구문으로 담아주는 것이 좋다. 결과는 기존과 동일하게 출력된다.