Java 입문 | java.lang 패키지 | Class 클래스


Class 클래스는 객체나 인터페이스의 런타임 상태를 저장한다. Class 타입의 객체는 클래스가 로드 될 때 자동으로 생성된다. Class 객체를 명시적으로 선언할 수 없으며, 일반적으로 Object 클래스의 getClass() 메소드를 이용하여 Class 객체를 얻는다.

Class 생성자

메소드 설명
static Class forName(String className) 매개변수로 className을 받아서 클래스를 로딩한 후에, 그 클래스에 해당하는 Class 객체를 반환한다.
String getName() 클래스명을 반환한다.
Class<? super T> getSuperclass() 상위 클래스를 반환한다.
T newInstance() Class가 포함하고 있는 클래스의 인스턴스를 생성한다.

Class 예제

예제 1)

package com.devkuma.tutorial.java.lang;

class Parent {
    int a = 2;
    int b = 3;
}

class Child extends Parent {
    int c = 4;
}

public class ClassClass {

    public static void main(String[] args) {
        Parent p = new Parent();
        Child c = new Child();

        Class<?> pc = p.getClass();
        Class<?> cc = c.getClass();

        System.out.println("pc ClassName:" + pc.getName());
        System.out.println("pc Super ClassName:" + pc.getSuperclass().getName());

        System.out.println("cc ClassName:" + cc.getName());
        System.out.println("cc Super ClassName:" + cc.getSuperclass().getName());
    }
}

실행 결과는 아래와 같다.

pc ClassName:com.devkuma.tutorial.javalang.Parent
pc Super ClassName:java.lang.Object
cc ClassName:com.devkuma.tutorial.javalang.Child
cc Super ClassName:com.devkuma.tutorial.javalang.Parent

예제를 보면 클래스명과 상위 클래스명으로 화면에 표시해 주고 있는걸 확인 할 수 있다.

예제 2)

package com.devkuma.tutorial.javalang;

class Calc {

    int a = 2;
    int b = 3;

    public int sum() {
        return a + b;
    }
}

public class ClassClass2 {

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        Class<?> clazz = Class.forName("com.devkuma.tutorial.javalang.Calc");

        Calc calc = (Calc) clazz.newInstance();

        System.out.println("sum : " + calc.sum());

    }
}

실행 결과는 아래와 같다.

sum : 5

여태까지 객체를 생성하기 위해서 new을 사용하여 객체를 생성했다. 위에 예제는 new를 이용하지 않고 Class.forName과 newInstance() 메소들 이용해서 객체를 생성하였다. 이는 클래스가 로딩을 할 때 로딩이 되는 것이 아니라 Class.forName()을 실행 시켰을 때 로딩이 된다. 이를 런타임 동적 로딩이라고 한다. 이 방식을 보안적이나 품질적으로 문제가 있을 수 있으니 jdbc로딩과 같은 특별한 경우를 제외하고는 이렇게 클래스를 생성을 하는 일을 없어야 한다.