728x90
반응형
SMALL
Class 클래스
- 자바의 모든 클래스와 인터페이스는 컴파일 후 class 파일이 생성됩니다.
- CLass 클래스는 컴파일된 class 파일을 로드하여 객체를 동적 로드하고, 정보를 가져오는 메서드가 제공됩니다.
- Class.forName("클래스 이름") 메서드로 클래스를 동적으로 로드합니다.
Class c = Class.forName("java.lang.String");
- 클래스 이름으로 직접 Class 클래스 가져오기
Class c = String.class;
- 생성된 인스턴스에서 Class 클래스 가져오기
String s = new String();
Class c = s.getClass(); // Object 메서드
동적 로딩
- 컴파일 시에 데이터 타입이 binding 되는 것이 아닌, 실행(runtime) 중에 데이터 타입을 binding 하는 방법이 있습니다.
- 프로그래밍 시에는 문자열 변수로 처리했다가 런타임시에 원하는 클래스를 로딩하여 binding 할 수 있다는 장점이 있습니다.
- 컴파일 시에 타입 감지가 되지 않아서 만약 런타임 때 불렀는데 라이브러리나 클래스가 로컬에 없거나 스펠링이 틀리다면 시스템이 다운될 수도 있다는 단점이 있습니다.
- 컴파일 시에 타입이 정해지지 않으므로 동적 로딩시 오류가 발생하면 프로그램의 심각한 장애가 발생 가능합니다.
Class의 newInstance()메서드로 인스턴스 생성
- new 키워드를 사용하지 않고 클래스 정보를 활용하여 인스턴스를 생성할 수 있습니다.
클래스 정보 알아보기
- reflection 프로그래밍 : Class 클래스를 사용하여 클래스의 정보(생성자, 변수, 메서드) 등을 알 수 있고 인스턴스를 생성하고, 메서드를 호출하는 방식의 프로그래밍입니다.
- 로컬 메모리에 객체가 없는 경우, 원격 프로그래밍, 객체의 타입을 알 수 없는 경우에 사용합니다.
- java.lang.reflect 패키지에 있는 클래스를 활용하여 프로그래밍합니다.
- 일반적으로 자료형을 알고 있는 경우엔 사용하지 않습니다.
StringTest.java
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class StringTest {
public static void main(String[] args) throws ClassNotFoundException {
Class c = Class.forName("java.lang.String");
Constructor<String>[] cons = c.getConstructors();
for(Constructor co : cons) {
System.out.println(co);
}
System.out.println("==================");
Method[] m = c.getMethods();
for(Method mth : m) {
System.out.println(mth);
}
}
}
Person.java
package ch36;
public class Person {
private String name;
private int age;
public Person() {}
public Person(String n) {
this.name = n;
}
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;
}
}
ClassTest.java
package ch36;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class ClassTest {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException,
IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
Class c1 = Class.forName("ch36.Person");
Person person = (Person)c1.newInstance();
person.setName("Lim");
System.out.println(person); // Lim
Class c2 = person.getClass(); // getClass를 사용하려면 이미 인스턴스가 있는 상태이어야 한다.
Person p = (Person)c2.newInstance();
System.out.println(p); // null
// Person woo = new Person("woo"); <- 위의 Class를 가져오는 17번째 줄의 코드와 아래 5줄의 코드랑 같은 의미
// 보통 아래처럼 사용하지 않는다. 아래와 같은 코드는 로컬에 Person이 없을때 사용한다.
Class[] parameterTypes = {String.class};
Constructor cons = c2.getConstructor(parameterTypes);
Object[] initargs = {"Woo"};
Person woo = (Person)cons.newInstance(initargs);
System.out.println(woo);
}
}
728x90
반응형
LIST
'Java' 카테고리의 다른 글
[JAVA] 자바 - 배열 구현하기 (0) | 2022.01.04 |
---|---|
[JAVA] 자바 - 자료구조 (0) | 2022.01.04 |
[JAVA] 자바 - String, StringBuilder, StringBuffer 클래스, text block (0) | 2021.12.14 |
[JAVA] 자바 - Object 클래스의 메서드 활용 (0) | 2021.12.14 |
[JAVA] 자바 - Object 클래스 - 모든 클래스의 최상위 클래스 (0) | 2021.12.14 |
댓글