본문 바로가기
언어/JAVA

Class 클래스

by step 1 2021. 4. 25.
반응형

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 할 수 있다는 장점
  • 컴파일 시에 타입이 정해지지 않으므로 동적 로딩시 오류가 발생하면 프로그램의 심각한 장애가 발생가능
package ch39;

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[] cons = c.getConstructors();
		
		// "java.lang.String"의 생성자 확인
		for (Constructor constructor : cons) {
			System.out.println(constructor);
		}
		
		System.out.println("=========================================================");
		Method[] m = c.getMethods();
		
		// "java.lang.String"의 메서드 확인
		for (Method method : m) {
			System.out.println(method);
		}
		
	}
}

결과

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

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

클래스 정보 알아보기

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

public class Person {

	private String name;
	private int age;
	
	public Person() {
		// TODO Auto-generated constructor stub
	}
	
	public Person(String name) {
		
		this.name = name;
	}

	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;
	}
	
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return name;
	}
}
package ch39;

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

public class ClassTest {

	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
		
		Class c1 = Class.forName("ch39.Person");
		
		Person person =  (Person) c1.newInstance();
		
		person.setName("Lee");
		System.out.println(person);
		
		Class c2 = person.getClass();
		Person p = (Person) c2.newInstance();
		System.out.println(p);
		
		Class[] parameterTypes = {String.class};
	    Constructor cons = c2.getConstructor(parameterTypes);
		
	    Object[] initargs = {"kim"};
	    Person kimP = (Person) cons.newInstance(initargs);
	    System.out.println(kimP);
	}
}

결과

반응형

'언어 > JAVA' 카테고리의 다른 글

배열(Array)  (0) 2021.04.26
자료구조 - 설명  (0) 2021.04.25
String, StringBuilder, StringBuffer, text block  (0) 2021.04.25
Object 클래스의 메서드 활용  (0) 2021.04.22
Object 클래스 - 모든 클래스의 최상위 클래스  (0) 2021.04.22