카테고리 없음

자바의 클래스들 4. Class 클래스

코딩펭귄 2023. 12. 20. 02:17

Class 클래스

  • 자바의 모든 클래스와 인터페이스는 컴파일 후 class 파일이 생성됨
  • Class 클래스는 컴파일 된 class 파일을 로드하여 객체를 동적 로드하고, 정보를 가져오는 메서드가 제공됨
  • Class.forName("클래스 이름") 메서드로 클래스를 동적으로 로드 함
Class c = Class.forName("java.lang.String"); 
//String클래스에 대한 Class를 가져옴 -> 런타임시 필요한 클래스를 로딩시켜 사용함(=동적로딩)

 

  • 클래스 이름으로 직접 Class 클래스 가져오기
Class c = String.class;
  • 생성된 인스턴스에서 Class 클래스 가져오기
String s = new String();
Class c = s.getClass();  //Object 메서드

 

동적 로딩

 

  • 컴파일 시에 데이터 타입이 binding 되는 것이 아닌, 실행(runtime) 중에 데이터 타입을 binding 하는 방법
  • 장점 : 프로그래밍 시에는 문자열 변수로 처리했다가 런타임시에 원하는 클래스를 로딩하여 binding 할 수 있다
  • 단점 : 컴파일 시에 타입이 정해지지 않으므로 동적 로딩시 오류가 발생하면(런타임시 라이브러리나 클래스가 로컬에 없거나, 오타가 있거나 하는 경우) 프로그램의 심각한 장애가 발생가능
package ch04;

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

//리플렉션 프로그램 
// 리플렉션 프로그램의 사용 이유 : 로컬에 이 오브젝트가 없을때, remote에있는 오브젝트나 클래스가 필요할때

public class StringTestf {

	public static void main(String[] args) throws ClassNotFoundException {
		
		Class c = Class.forName("java.lang.String"); //동적으로 클래스 로딩함 String의 S대문자로 쓰는것 주의
		
		Constructor[] cons = c.getConstructors();
		for(Constructor co : cons) {
			System.out.println(co); //java.lang의 수만은String생성자들 출력
		}
		
		Method[] m = c.getMethods();
		for(Method mth : m ) { //m에서 하나씩 꺼내서 찍는것. 수많은 메소드들
			System.out.println(mth);
		}
	}

}

 

 

Class의 newInstance()메서드로 인스턴스 생성

  • new 키워드를 사용하지 않고 Class 클래스 정보를 활용하여 인스턴스를 생성할 수 있음

아래의 Person클래스를 이용하여 클래스 가져오고, newInstance, reflection등에 활용

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;
	}
	//toString 오버라이딩
	public String toString() {
		return name;
	}
}

 

클래스 정보 알아보기

  • reflection 프로그래밍 : Class 클래스를 사용하여 클래스의 정보(생성자, 변수, 메서드)등을 알 수 있고 인스턴스를 생성하고, 메서드를 호출하는 방식의 프로그래밍
  • 로컬 메모리에(같은 메모리에) 객체 없는 경우, 원격 프로그래밍, 객체의 타입을 알 수 없는 경우에 사용
  • java.lang.reflect 패키지에 있는 클래스를 활용하여 프로그래밍
  • 일반적으로 자료형을 알고 있는 경우엔 사용하지 않음
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class ClassTest {

	public static void main(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException,
						ClassNotFoundException, NoSuchMethodException, SecurityException {
		
		//클래스 클래스 가져오는 방법 1.Class.forName()
		Class c1 = Class.forName("ch04.Person");
		Person person1 = (Person)c1.newInstance();
		person1.setName("Lee");
		System.out.println(person1); //Lee
		
		
		//클래스 클래스 가져오는 방법 2.getClass() -> 이미 인스턴스가 있는 상태일 경우 쓸수있음
		Class c2 = person.getClass(); 
		Person person2 = (Person)c2.newInstance();
		System.out.println(person2); //null ->default constructor 호출
		
		Class[] parameterTypes = {String.class}; //{String.class}에 해당하는 constructor 찾아서
		Constructor cons = c2.getConstructor(parameterTypes); // 반환해줌
		
		Object[] initargs = {"KIM"};
		Person KIMPerson = (Person)cons.newInstance(initargs);
		System.out.println(KIMPerson); //KIM
		
	}
}

 

위 코드의 마지막 5줄은 이렇게 한 줄로 구현된다

Person KIM2 = new Person("KIM");