지금까지 자바를 학습하며 클래스에 대해서 열심히 배우고 있었다. 그런데 갑자기 Class 클래스라니 무슨말일까?? 메타데이터 같은 것인가?

 

Class 클래스의 인스턴스 가져오기

 

일단 Class 클래스는 클래스를 분석할 수 있는 클래스이다. 예제로 보는 것이 빠르다.

 

 

Class 클래스 자바독

 

Class (Java Platform SE 7 )

Determines if the specified Class object represents a primitive type. There are nine predefined Class objects to represent the eight primitive types and void. These are created by the Java Virtual Machine, and have the same names as the primitive types tha

docs.oracle.com

 

package com.kay.Swing;

public class BasicClass2 {

    public static void main(String[] args) throws Exception{

        String str1 = new String();
        Class cla1 = str1.getClass();
        System.out.println(cla1.getName());

        ClassMan cm1 = new ClassMan();
        Class cClass1 = cm1.getClass();
        System.out.println(cClass1.getName());

        Class cClass2 = ClassMan.class;
        System.out.println(cClass2.getName());

        Class cClass3 = Class.forName("com.kay.Swing.BasicClass");
        System.out.println(cClass3.getName());
    }
}

상기 예제를 보면 Class 는 여러가지 방법으로 클래스에 대한 정보를 가져올 수 있다. 

 

        String str1 = new String();
        Class cla1 = str1.getClass();
        System.out.println(cla1.getName());

* 먼저 문자열 객체를 생성한후. 문자열 객체의 getClass() 메소드로 인스턴스를 반환 받을 수 있다.

getClass 는 어디서 나왔냐면 Object 클래스(모든 클래스의 조상)에 정의되 있다. 이 String 객체의 런타임 클래스를 대표하는 클래스 객체를 반환한다. 즉 반환되는 객체에는 String 객체에 대한 정보를 담고 있다.

 

        Class cClass2 = ClassMan.class;
        System.out.println(cClass2.getName());

위와 같이 클래스 파일을 직접 대입하는 방법도 있다. ClassMan.java를 컴파일하면 ClassMan.class가 된다. 저렇게 찾으려면 먼저 컴파일을 해놔야 한다. 클래스 파일에서 직접 가져오는 방식은 동적로딩 기술과 연결되있다.

 

Class cClass3 = Class.forName("com.kay.Swing.BasicClass");
System.out.println(cClass3.getName());

forName은 패키지와 이름을 알고 있을 때 사용할 수 있다. 이것도 동적로딩이 가능하다.

 

클래스의 정보 가져오기 (생성자,메소드,변수)

 

Class 클래스로 정보를 가져올 수 있다. 최고 조상의 Object 클래스를 털어보자.

 

package com.kay.Swing;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class BasicClass3 {

    public static void main(String[] args) throws Exception{

        Class anc1 = Class.forName("java.lang.Object");

        System.out.println("--------------------  CONSTRUCTOR  -----------------------");

        Constructor[] cons = anc1.getConstructors();
        for(Constructor c1 : cons){
            System.out.println(c1);
        }

        System.out.println("--------------------  FIELD  -----------------------");

        Field[] fld = anc1.getFields();
        for(Field f1 : fld){
            System.out.println(f1);
        }

        System.out.println("--------------------  METHOD  -----------------------");

        Method[] mthd = anc1.getMethods();
        for(Method m1 : mthd){
            System.out.println(m1);
        }

    }
}

Object Class 인스턴스

Object 클래스에는 별 내용이 없다. 다만 조금전에 사용한 getClass() 메소드가 들어있다. 모든 클래스들은 처음부터 getClass ( ) 를 사용해서 Class 객체에 인스턴스 전달이 가능하게 설계되있다. 그 밖에 튜토리얼에서 커버한 toString, hashCode, equals 등의 메소드가 있다. 

 

        Constructor[] cons = anc1.getConstructors();
        for(Constructor c1 : cons){
            System.out.println(c1);
        }

* 여기까지 학습한 사람들이면 이 코드블록 하나만 설명하면 충분 할 것이다. Constructor 는 java.lang.reflect 패키지에 있다. 당연히 생성자에 관련한 클래스이다. 지금 선택된 Object 클래스의 생성자들을 모두 가져온다. for 의 향상된 방식은 처음 봤을 수도 있다. cons 배열에 있는 요소들을 순차적으로 꺼낼 때마나 for루프를 도는 방식이다.  for (int i=0; i<cons.length; i++) 이것 보다는 나은 것 같다. 파이썬의 for문법과 유사하다. 파이썬은 처음부터 for i in range(10) 같은 방식이다.

 

가져온 클래스의 인스턴스 생성하기 (동적 클래스 로딩)

동적 클래스 로딩은 이 단계에서 배울 필요는 없지만 후반에 가면 사용하게 될 것이다.

 

package com.kay.Swing;

public class BasicClass4 {

    public static void main(String[] args) throws Exception{
        ClassMan cm1 = new ClassMan();
        System.out.println(cm1);

        Class cClass = Class.forName("com.kay.Swing.ClassMan");
        ClassMan cm2 = (ClassMan)cClass.newInstance();
        System.out.println(cm2);
    }
}

 

*클래스를 프로그램 실행중에 가져와서 바로 객체를 만들 수가 있다. 실행시 어떻게 될지 모르기때문에 Exception 처리를 안해주면 컴파일 오류가 난다. 위의 코드는 아래 사용자정의 클래스의 인스턴스를 동적으로 생성한다. 패키지와 이름을 알면 다운캐스팅으로 인스턴스를 생성할 수 있다.(Object 형으로 생성되니까) 네트워크와 DB 관련 코드 작성시에 다시 보게 된다.

 

package com.kay.Swing;

public class ClassMan {

    private String name;
    private int age;

    public ClassMan(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public ClassMan(String name) {
        this.name = name;
    }

    public ClassMan(){
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

 

공유하기

facebook twitter kakaoTalk kakaostory naver band