만약, 클래스의 종류가 실행할 때 결정이 된다면 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();
}
}
}
데이터를 보냅니다.
데이터를 받습니다.
'Java > 11. 기본 API 클래스' 카테고리의 다른 글
Day 15 : String 클래스 - charAt() : 문자 추출 (0) | 2021.11.08 |
---|---|
Day 15 : String 클래스 - String 생성자 (0) | 2021.11.08 |
Day 15 : Class 클래스 - getDeclaredConstructors(), getDeclaredFields(), getDeclaredMethods() : 리플렉션 (0) | 2021.11.08 |
Day 15 : Class 클래스 - getClass(), forName() : Class 객체 얻기 (0) | 2021.11.08 |
Day 15 : System 클래스 - getenv() : 환경 변수 읽기 - 다시해보기 (0) | 2021.11.08 |