brunch

You can make anything
by writing

C.S.Lewis

by 김선우 Apr 30. 2016

Class 객체

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() 은 자바의 스펙에 규정된 이름을 반환한다고 한다.

http://stackoverflow.com/questions/15202997/what-is-the-difference-between-canonical-name-simple-name-and-class-name-in-jav


** Thinking in java 를 참고하였습니다.


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari