코딩하는 털보

OOP - 46 본문

IT Study/JAVA OOP

OOP - 46

이정인 2020. 12. 24. 11:24

객체 지향 프로그래밍

46. Class 클래스

  • Class 클래스
    자바의 모든 클래스와 인터페이스는 컴파일 후 class 파일로 생성됨
    class 파일에는 객체의 정보(멤버변수, 메서드, 생성자 등)가 포함되어 있음
    Class 클래스는 컴파일된 class 파일에서 객체의 정보를 가져올 수 있음
    동적 로딩에 많이 사용

Class 클래스 가져오기

String s = new String();
Class c = s.getClass();
Class c = String.Class;
Class c = Class.forName("java.lang.String"); //동적 로딩 : 컴파일 타임이 아닌 런타임에서 로딩
  • reflection 프로그래밍
    Class 클래스로부터 객체의 정보를 가져와 프로그래밍하는 방식
    로컬에 객체가 없고 자료형을 알 수 없는 경우 유용한 프로그래밍
    java.lang.reflect 패키지에 있는 클래스 활용

String 클래스 정보 확인

package classex;

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

public class StringClassTest {
    public static void main(String[] args) throws ClassNotFoundException {

        Class c1 = String.class;

        String str = new String();
        Class c2 = str.getClass();

        Class c3 = Class.forName("java.lang.String");

        Constructor[] cons = c3.getConstructors();
        for (Constructor con : cons) { //String 클래스의 모든 생성자 출력
            System.out.println(con);
        } //보통 로컬에 이 클래스가 없을 때 사용
        System.out.println();

        Method[] methods = c3.getMethods();
        for (Method method : methods) { //String 클래스의 모든 메서드 선언부 출력
            System.out.println(method);
        }

    }
}

Class 클래스를 이용한 사용자 클래스 인스턴스 생성

package classex;

public class Person {
    private String name;
    private int age;

    public Person() {};

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

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

    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;
    }

    public String toString() {
        return name;
    }
}
package classex;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class ClassTest {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {

        Person person = new Person("james");
        System.out.println(person);

        Class c1 = Class.forName("classex.Person"); //동적 로딩
        Person person1 = (Person)c1.newInstance(); //기본생성자 사용하여 인스턴스 생성, 리턴타입이 Object이므로 다운캐스팅
        System.out.println(person1);

        //기본생성자가 아닌 다른 생성자를 사용하여 인스턴스를 생성하려는 경우..
        Class[] parameterTypes = {String.class}; //String을 사용하는 생성자를 사용할 것
        Constructor cons = c1.getConstructor(parameterTypes); //생성자 매개변수 타입을 요소로 가지는 Class 타입 배열 필요

        System.out.println(cons.toString()); //선택된 생성자 출력

        Object[] initargs = {"김유신"}; //생성자의 매개변수로 사용될 값들을 요소로 가지는 배열(여러개일 수 있으므로 배열 사용)
        Person personKim = (Person) cons.newInstance(initargs); //매개변수 값을 요소로 가지는 Object 타입 배열 필요
        System.out.println(personKim);
    }
}
  • forName() 메서드와 동적 로딩
    Class 클래스 static 메서드
    동적 로딩 : 컴파일시 데이터 타입이 모두 biding되어 자료형이 로딩되는 것이 아닌,
    실행 중에 데이터 타입을 알고 biding 되는 방식
    실행 시에 로딩되므로 경우에 따라 다른 클래스가 사용될 수 있어 유용함
    컴파일 타임에 체크할 수 없으므로 해당 문자열에 대한 클래스가 없는 경우 예외 발생
Comments