Class.class에 대한 나의 생각.

Class 클래스가 있습니다.
저 처음에 자바 공부 할 때 이 클래스는 도대체 뭔가???? 했었습니다.
String.class 라는 것이 코드 속에 나오는 것도 엄청 신기했습니다.
String.class는 파일로만 존재하는 것인 줄 알았었습니다.

Class 클래스는 무엇일까요.

Java의 OOP를 얘기 할 때 나오는 얘기 중 가장 많이 나오는 것이..
클래스를 만들어 틀을 만들어 놓고 , 이 틀을 사용해 인스턴스를 찍어낸다(?)라는 것입니다.


위 처럼 User 클래스를 만들어서 틀을 만들고

이렇게 인스턴스를 만들어냅니다. 이때 생성 된 User 클래스의 인스턴스들은
모두 이름,주민번호라는 필드와 getName, setName등의 메서드들을 가지고 있게 됩니다.
데이터와 행동을 가지고 있는 것이지요.
이처럼 User에서 만들어지는 객체들이 가져야 할 것들을 정의 하고 있는 것이 User 라는 클래스입니다.

그러면 한단계만 더 위로 올라가보면..
User라는 클래스는 필드와 메서드를 가지고 있습니다.
물론 클래스에는 더 많은 속성들이 존재하지만 일단 논외로 두고요..

일단 필드와 메서드만을 놓고 봤을 때
이렇게 만든 User라는 클래스 즉, User.class도 필드와 메서드를 가지고 있고
java의 기본 클래스인 String.class도 필드와 메서드를 가지고 있는 것이지요.

즉, Java에서 사용되는 Class들에 대한 정의를 하고 있는 틀이 Class.class 입니다.

Java Api 문서에는
Instances of the class Class represent classes and interfaces in a running Java application. Every array also belongs to a class that is reflected as a Class object that is shared by all arrays with the same element type and number of dimensions.
Class 클래스의 객체는 자바 프로그램에서 사용되는 클래스들과 인터페이스들을 나타낸다고 되어 있습니다.

Class.class가 가지고 있는 메서드를 조금 보면 이해가 더 되시리라 생각됩니다.

일단, static으로 되어 있는 forName 메서드가 있습니다.
jdbc 예제에서 많이 나오는 메서드로... Class.forName("java.lang.String"); 으로 실행하면
해당 이름을 갖는 클래스(String)의 정보를 담은 Class instance를 리턴해줍니다.



java.lang.String 클래스의 정보를 가지고 있는 클래스 인스턴스를 얻어서
이름과 메서드에 대한 정보를 출력하는 예제입니다.
이러한 것이 가능한 이유는 자바에서 사용되는 모든 클래스들은 공통된 속성을 가지고 있고 (필드, 메서드등.)
그 속성을 정의하고 있는 것이 Class 클래스이기 때문입니다.

Class 클래스의 객체는 많은 메서드들을 가지고 있습니다. 모두 클래스에 대한 메서드들입니다.

어노테이션,생성자,필드등도 가져 올 수 있고
이것을 사용하여 리플렉트로 객체를 생성 할 수도 있고 상위 클래스들을 가져 올 수도 있습니다.
메서드를 실행 할 수도 있습니다.

new String(); 을 하지 않아도 위 처럼 그 String 클래스가 가진 메서들을 가지고 올 수도 있고
객체도 얻을 수 있고, 메서드를 실행 할 수도 있습니다.

우리가 만든 User 클래스의 객체들은 모두 이름과 주민번호를 갖는다. 라는 것과 비교해보면
좋을 것 같습니다.

결국 Class 클래스를 이용해서 우리가 다루는 모든 클래스에 대한 정보들을 얻어 올 수 있습니다.
저작자 표시 비영리 변경 금지
신고
Posted by 용식