Class 클래스.
자바의 모든 클래스와 인터페이스는 컴파일 후 class 파일이 생성 됩니다.
Class 클래스는 컴파일 된 class 파일을 로드하여 객체를 동적 로드하고, 정보를 가져오는 메서드가 제공됩니다.
Class.forName("클래스 이름")메서드로 클래스를 동적으로 로드합니다.
우리가 모르는 클래스 정보를 사용할 경우에 Class 클래스를 활용합니다.
Class 클래스를 선언하고 클래스 정보를 가져오는 방법은 다음과 같습니다.
Class.forName("클래스 이름") 메서드 사용하기
Object 클래스의 getClass() 메서드 사용하기
클래스 파일 이름을 Class 변수에 직접 대입하기
class MyClass {
}
public class ClassClassTest {
public static void main(String[] args) throws ClassNotFoundException {
// Class.forName("클래스 이름") 메서드 사용하기
Class c = Class.forName("java.lang.String");
System.out.println("c의 클래스: " + c.getName()); // c의 클래스: java.lang.String
// Object 클래스의 getClass() 메서드 사용하기
MyClass m1 = new MyClass();
Class c1 = m1.getClass();
System.out.println("c1의 클래스: " + c1.getName()); // c1의 클래스: packageInfo +.java.MyClass
// 클래스 파일 이름을 Class 변수에 직접 대입하기
Class c2 = MyClass.class;
System.out.println("c2의 클래스: " + c2.getName()); // c1의 클래스: packageInfo +.java.MyClass
}
}
동적 로딩.
동적 로딩(Dynamic loading)은 프로그램 실행 중에 필요한 클래스나 리소스를 동적으로 로드하는 기법을 말합니다.
정적 로딩(Static loading)은 컴파일 시에 필요한 클래스를 미리 로드하는 반면, 동적 로딩은 프로그램 실행 중에 필요한 클래스를 동적으로 로드하여 사용하는 방식입니다.
Java에서 동적 로딩은 Class.forName() 메서드와 리플렉션(Reflection)을 활용하여 수행할 수 있습니다.
Class.forName() 메서드는 지정된 클래스 이름을 사용하여 해당 클래스를 동적으로 로드하고, 그 클래스의 Class 객체를 반환합니다. 이후에는 리플렉션을 사용하여 로드된 클래스의 생성자, 메서드, 필드 등에 접근할 수 있습니다.
Class 클래스를 활용해 클래스 정보 알아보기.
- reflection 프로그래밍 : Class 클래스를 사용하여 클래스의 정보(생성자, 변수, 메서드)등을 알 수 있고 인스턴스를 생성하고,
메서드를 호출하는 방식의 프로그래밍
- 로컬 메모리에 객체 없는 경우, 원격 프로그래밍, 객체의 타입을 알 수 없는 경우에 사용
- java.lang.reflect 패키지에 있는 클래스를 활용하여 프로그래밍
- 일반적으로 자료형을 알고 있는 경우엔 사용하지 않음
어떤 클래스의 정보를 모른다고 가정할 때 Class클래스를 활용해 멤버변수, 생성자, 메서드 등을 확인하는 방법입니다.
class Person {
// 멤버 변수
public String name;
public 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 toString() {
return this.name;
}
}
public class ClassClassTest1 {
public static void main(String[] args) throws
ClassNotFoundException, NoSuchMethodException, InvocationTargetException,
InstantiationException, IllegalAccessException {
// 클래스 이름으로 가져오기
Class<?> c1 = Class.forName("june2023.day11.java.Person");
// 모든 생성자 가져오기
Constructor<?>[] constructors = c1.getConstructors();
// 출력
for (Constructor<?> constructor : constructors) {
System.out.println(constructor);
}
// 결과
// public june2023.day11.java.Person(java.lang.String,int)
// public june2023.day11.java.Person(java.lang.String)
// public june2023.day11.java.Person()
// 모든 멤버변수 가져오기 - public만 가능 private면 안됨
Field[] fields = c1.getFields();
for (Field field : fields) {
System.out.print(field + " ");
// public java.lang.String june2023.day11.java.Person.name public int june2023.day11.java.Person.age
}
// 모든 메서드 가져오기
System.out.println();
Method[] methods = c1.getMethods();
for (Method method : methods) {
System.out.println(method);
}
}
}
'BACKEND > JAVA' 카테고리의 다른 글
제네릭(Generic) 프로그래밍 이해하기 (0) | 2023.06.11 |
---|---|
인터페이스 여러가지 요소와 인터페이스의 상속 (0) | 2023.06.09 |
인터페이스와 다형성(DAO) 활용하기 (0) | 2023.06.09 |
상속과 추상 클래스, 템플릿 메서드 패턴 (0) | 2023.06.09 |
상속과 메서드 오버라이딩, 가상 메서드 원리 (0) | 2023.06.08 |