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 용식

댓글을 달아 주세요

  1. pungjoo.kim 2010.02.17 15:06 신고  댓글주소  수정/삭제  댓글쓰기

    static 이라는 키워드를 더 생각해 봐.
    광범위하게 method에만 국한하지 말고.

    @

  2. 볼라덕 2013.06.05 14:18 신고  댓글주소  수정/삭제  댓글쓰기

    유저 클래스가.. user 에 대한 필드와 메서드를 정의하는 틀이라면...
    class 라는 것은 모든 클래스들이 가지는 구조 자체를 정의하는 틀이라 이건가요?
    증말 어렵네요 ㅠㅠ

    • 용식 2013.06.06 00:36 신고  댓글주소  수정/삭제

      이 내용이 참 설명이 어렵더라구요..^^ 글로 쓰기도 어렵고.. 사내 세미나에서도 강의를 해봤는데 어렵더군요 ㅎㅎ
      그런데 말씀하신 내용이 맞습니다.
      클래스들의 구조 자체를 정의하는 것이 Class.class이고
      각 Type들의 (String, Map등) Class.class의 인스턴스가 각 Type이 가지고 있는 실제 필드와 메서드들을 가지고 있는 인스턴스이죠~

      이 인스턴스들이 Reflect등에서 어떻게 사용되는지 이해하시면 될것 같습니다.

      내용이 어려운건 제가 설명을 못 해서이지.. 내용 자체가 어려운것은 아니랍니다 ㅠㅠ

  3. 아크 2013.07.15 17:47  댓글주소  수정/삭제  댓글쓰기

    퍼가요~

  4. 성큰굿 2013.10.22 21:22 신고  댓글주소  수정/삭제  댓글쓰기

    실례하겠습니다 좀 퍼가겠습니다 :)감사합니다.

  5. 이눔버스 2016.02.22 22:04  댓글주소  수정/삭제  댓글쓰기

    class명.class.함수(); 이런형태도 있던데
    여기서 가운데 있는 class는 혹시 뭔지 알수 있을까요>

    • 용식 2016.02.24 12:28 신고  댓글주소  수정/삭제

      String.class.getAnnotations();

      같은 것 말씀이시죠?
      String type의 Class class의 instance라고 보시면 될 것 같아요.

      저 메서드는 결국 Class.java.getAnnotations() 거든요.

  6. 준티 2016.07.29 13:28 신고  댓글주소  수정/삭제  댓글쓰기

    윗분 말씀대로 Class 클래스는 모든 클래스들의 구조자체를 정의한 틀이라는 거군요.
    Class 클래스의 메서드,필드를 보니까 이해가 갑니다.
    예를 들어 String 클래스의 .class를 호출하면 String 클래스를 정보를 Class 클래스의 형태로
    반환해주는것이네요.

    잘못 이해한점이 있으면 지적 부탁드리겠습니다.

    Class에도 .class가 있어서 좀 혼란스러웠는데 결국 Class 클래스도 클래스라는 거네요

    좋은 글 감사합니다.

  7. Curtis 2017.09.09 12:55  댓글주소  수정/삭제  댓글쓰기

    좀더 쉽게 ㅠ

  8. LEELAB 2018.04.14 00:52 신고  댓글주소  수정/삭제  댓글쓰기

    이해가 정말 잘 되게 정리해놓으셨어요!
    감사합니당