Class 객체란 특별한 종류의 객체로서 각 클래스에 대한 정보를 갖고 있으며(MetaClass),
우리 클래스의 모든 객체를 생성하기 위해 사용된다.
각 클래스마다 하나의 Class 객체가 존재하며, 우리가 클래스를 작성 할 때마다 Class 객체도 하나씩 생긴다.
그 정보는 .class 파일에 저장이 된다. 그리고 클래스의 객체를 만들기 위해 JVM이 클래스로더(class loadeer)를 사용한다.
클래스를 최초로 사용하는 시점에서 클래스는 동적으로 JVM에 로드된다. 해당 클래스의 static 멤버를 참조할 때 이런 일이 일어난다. 생성자는 클래스의 static 메소드이다. 그래서 new 키워드를 사용하여 클래스의 객체를 생성하는 것도 그 클래스의 멤버를 참조하는 것으로 간주된다.
즉, 자바 프로그램은 시작에 앞서 완전하게 로드되지 않는다. (때문에 다형성이란 개념도 사용 가능한 것 같다)
클래스로더는 해당 타입의 Class 객체가 로드되었는지 확인한다, 안되었다면 .class 파일을 찾는다.
해당 타입의 Class 객체가 메모리에 로드되면 그 타입의 모든 객체를 생성하기 위해 사용된다.
Class 객체도 여느 객체와 마찬가지로 참조를 얻어서 사용할 수 있다.(클래스로더가 하는 일이라고 한다)
Class 객체에 대한 참조를 얻는 방법 중 하나는 forName()이다.
예시)
Class.forName("yourClass");
'yourClass' 클래스의 정보를 갖고 있는 Class 객체 참조를 반환한다.
이미 객체를 갖고 있다면 getClass(); 를 호출하여 사용 가능하다.
getName() : 전체 경로명의 클래스명 ex) kr.co.brunch.artiveloper.write3
getCanonicalName() : 전체 경로명의 클래스명 ex) kr.co.brunch.artiveloper.write3
getSimpleName() : 패키지명이 없는 클래스명 ex) write3
getName() 은 자바의 스펙에 규정된 이름을 반환한다고 한다.
** Thinking in java 를 참고하였습니다.