만약, 클래스의 종류가 실행할 때 결정이 된다면 new 연산자를 사용해서 객체 생성이 불가하다.

Class 객체를 이용하면 new 연산자를 사용하지 않아도 동적으로 객체를 생성할 수 있다.

① Class.forName() 메소드로 Class 객체를 얻은 다음

newInstance() 메소드를 호출하면 Object 타입의 객체를 얻을 수 있다.

→ Object 객체가 오는 이유 : 어떠한 객체가 올지 모르기 때문에 최상위 부모 객체인 Object가 오므로써 어떠한 객체라도 강제 타입 변환하여 사용이 가능하게 한다.

※ newInstance() 메소드는 기본 생성자를 호출해서 객체를 생성하기 때문에 반드시 클래스에 기본 생성자가 존재해야 한다.

 

 

인터페이스

package sec06.exam03_newinstance;

public interface Action {
	public void execute();
}

 

발신 클래스

package sec06.exam03_newinstance;

public class SendAction implements Action {

	@Override
	public void execute() {
		System.out.println("데이터를 보냅니다.");		
	}	
}

 

수신 클래스

package sec06.exam03_newinstance;

public class ReceiveAction implements Action {

	@Override
	public void execute() {
		System.out.println("데이터를 받습니다.");
	}
}

 

동적 객체 생성 및 실행

package sec06.exam03_newInstance;

public class NewInstanceExample {
	public static void main(String[] args) {
		try {
			Class clazz = Class.forName("sec06.exam03_newInstance.SendAction");
			//Class clazz = Class.forName("sec06.exam03_newInstance.ReceiveAction");
			Action action = (Action) clazz.newInstance(); //newInstance가 Object 타입의 객체를 리턴하므로, Action 타입의 인터페이스로 강제 타입 변환
			action.execute(); //구현 객체에서 재정의된 메소드 실행
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		
	}
}
데이터를 보냅니다.
데이터를 받습니다.

+ Recent posts