[Java] 자바 getClass , forName을 통한 클래스 객체 얻기!

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 구문으로 담아주는 것이 좋다. 결과는 기존과 동일하게 출력된다.