Java_Class 클래스

song·2023년 10월 20일

Java

목록 보기
28/36

Class 클래스

  • 'Class 클래스'는 컴파일 된 class 파일에 저장된 클래스나 인터페이스 정보를 가져올 때 사용.
  • 자바는 컴파일 후 class 파일로 생성된다.
    예를들어 Ex29_4.java 파일 컴파일되면 out폴더에 Ex29_4.class라는 파일이 생성되고, 해당 class 파일에는 객체의 메타데이터(생성자, 멤버변수, 메서드, 인터페이스)를 포함하고 있다.
    그런데 생성자 정보들은 감추고 있기 때문에 new Class() 이런식으로 객체를 생성할 수 있다.
  • ★Class 클래스를 이용해서 class 파일에서 정보를 불러올 수 있다.

사용하는 이유

  • 원래는 변수 선언시 사용할 자료형을 미리 파악하고 생성했었다.
    클래스도 마찬가지로 클래스 정보를 코드상에 눈으로 봐가면서 프로그램을 만들었다.
    그런데 특정 경우에는 여러 클래스들 중에 다른 클래스를 사용해야 하는 경우도 있거나 리턴받는 클래스의 타입을 모를 때도 있다.
    이때 Class 클래스를 이용해서 해당 클래스의 정보를 가져오거나 인스턴스를 생성할 수 있다.

★(중요) Class 클래스의 메서드들

  1. 객체 정보 얻기
    • getClass() 메서드
      Object 클래스에 속해 있는 메서드
      현재 참조하고 있는 클래스를 확인 할 수 있는 메서드
      (예를들어 A 클래스를 참조하고 있으면 'XX.XXX.class A' 이런식으로 출력됨.
      사용하려면 인스턴스가 생성되어 있어야 함.
      getName() 메서드는 클래스 빼고 클래스 이름만 출력됨.
      • ex)
        String str = new String("aaa");
        Class c1 = str.getClass();
        System.out.println(c1);
        -> class java.lang.String 이라고 출력된다.
      • ex)
        Main main = new Main();
        Class c = main.getClass();
        System.out.println(c);
        System.out.println(c.getName());
        -> class Main, Main 라고 출력된다.
    • forName(클래스명)
      (매개변수로 보내는 클래스명이 존재하지 않으면 ClassNotFoundException 에러남. throws로 날려도 됨)
      사용하려면 컴파일된 클래스 파일이 있어야 함(한 번이라도 Run 하면 out 폴더에 있음)
      • ex) Class c2 = Class.forName("Main");
        -> 패키지명.클래스이름 으로 찾으면 된다.
        해당 클래스가 없을 수 있으니까 메서드에 throws ClassNotFoundException 써주면 된다.
    • 생성자 가져오기
      Constructor[] cons = c2.getConstructors(); // 모든 생성자 가져오기
      for(Constructor c : cons) {
          System.out.println("생성자 정보: " + c);
      }
    • 멤버 변수 가져오기
      Field[] fields = c2.getFields(); // 모든 변수(필드)정보 가져오기
      Field[] fields2 = c2.getDeclaredFields(); // 모든 변수(필드)정보 가져오기 (private 포함)
      for(Field f : fields){ // Main에 필드가 private라서 접근 못 함. 보려면 public으로 변경할 것. 
      	System.out.println("필드 정보 : " + f);
      }
    • 멤버 메서드 가져오기
      Method[] methods = c2.getMethods(); // 모든 메서드정보 가져오기
      for(Method m : methods){
      	System.out.println("메서드 정보 : " + m);
      }
    • 정보 얻을 클래스의 파일명을 Class 변수에 직접 대입
      사용하려면 컴파일된 클래스 파일이 있어야 함(한 번이라도 Run 하면 out 폴더에 있음)
      • ex) Class c1 = Ex29_2_Math.class;
  2. 동적 객체 생성
    • newInstance()
    • class 객체를 이용하면 new 연산자없이 그때그때 필요한 객체를 생성할 수 있다.
    • 편하긴한데 이 방법은 코드상에서는 클래스이름을 우리가 정할 수 없다.
    • 주의 : newInstance()는 항상 Object타입으로 반환하기 때문에 생성된 객체형으로 형변환을 해서 리턴해줘야함.
    • 기존방식 : 해당 클래스의 생성자를 이용해서 생성
      Main main = new Main();
    • newInstance() 방식 : newInstance()로 객체화
      //Class klass = Class.forName(main.getClass().getName());
      Class klass = Class.forName("Main")
      Main main = (Main)klass.newInstance(); // newInstance()는 Object타입으로 반환하기때문에 (Main)을 써서 형변환. 
      -> newInstance()는 Object타입으로 반환하기때문에 (Main)을 써서 형변환.
      -> main 클래스 이름을 사용해 Class 클래스를 반환했다.
      -> 그리고 Class 클래스의 newInstance()를 호출하면 Main 클래스의 디폴트 생성자가 호출되어 인스턴스가 생성된다.
profile
계속 나아가기

0개의 댓글