Back-end/이것이 자바다[신용권 한빛미디어]

Class 클래스

Ho's log 2021. 10. 23. 16:26

클래스와 인터페이스의 메타 데이터를 java.lang 패키지에 소속된 Class 클래스로 관리

*메타 데이터란 클래스의 이름, 생성자 정보, 필드 정보, 메소드 정보를 말함

 


Class 객체 얻기 (getClass(), forName())

프로그램에서 Class 객체를 얻기 위해서는 Object 클래스가 가지고 있는 

geeClass() 메소드를 이용하면 된다

 

Class class = obj.getClass()

 

getClass() 메소드는 해당 클래스로 객체를 생성했을 때만 사용

객체를 생성하기 전 직접 Class 객체를 얻을 수 잇다.

Class는 생성자를 감추고 있기 때문에 new 연산자로 객체를 만들수 없다

정적 메소드인 forName()을 이용

forName() 메소드는 클래스 전체이름(패키지가 포함된 이름)을 매개값으로 받고 Class 객체를 리턴한다

 

try {

	Class clazz = Class.forName(String className);
    

} catch (ClassNOtFoundException e){

}

리플렉션(getDeclaredConstructors(), getDeclaredFields(), getDeclaredMethods())

Class 객체를 이용하면 클래스의 생성자, 필드, 메소드 정보를 알아 낼수 있다

-> 이것은 리플렉션(Reflection) 라고 함

 

Class 객체는 리플렉션을 위해 getDeclaredConstructors(), getDeclaredFields(), getDeclasredMehtods() 를 제공

Constructor[] constructors = clazz.getDeclaredConstructors();
Field[] fields = clazz.getDeclaredFields();
Method[] methods = clazz.getDeclaredMethods();

 

세 메소드는 각각 Constructor 배열, Field 배열, Method 배열을 리턴

Constructor, Field, Method 클래스는 모두 java.lang.reflect 패키지에 소속 되어 있다.

getDeclaredFields(), getDeclaredMethods() 는 클래스에 선언된 멤버만 가져오고 상속된 멤버는 가져오지 않는다.

 

상속된 멤버를 얻고 싶다면 getFields(), getMethods() 를 이용 해야한다.

단 getFields(), getMethods() 는 public 멤버만 가져온다 


동적 객체 생성(newInstance())

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

이 방법은 코드 작성 시에 클래스 이름을 결정할 수 없고, 런타임 시에 클래스 이름이 결정 되는 경우에

매우 유용하게 사용

 

try{
	Class clazz = Class.forName("런타임시 결정되는 클래스 이름");
    Object obj = clazz.newInstance();
    
    

} catch (ClassNotFoundException e){

} catch (InstantiationException e){

} catch (IllegalAccessException e ){
}

 

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

매개변수가 있는 생성자를 호출하고 싶다면 리플렉션으로 Constructor 객체를 얻어 newInstance() 메소드를 호출하면 됨

 

newInsatnce() 메소드는 두가지 예외가 발생할수 있다

InstantiationException 예외는 해당 클래스가 추상 클래스이거나 인터페이스 일때 발생

IllegalAccessException 예외는 클래스나 생성자가 접근 제한자로 인해 접근할 수 없을 경우에 발생 

 

newInstance() 메소드의 리턴 타입은 Object이므로 이것을 원래 클래스 타입으로 변환해야만 메소드 사용가능

-> 강제 타입 변환 필요 but 클래스 타입을 모르는 상태이므로 변환을 할수 없음

-> 이문제를 해결하려면 인터페이스 사용 필요

Class clazz = Class.forName("SendAction" || "ReciveAction");
Action action = (Action) clazz.newInstance();
action.execute();

 

 

'Back-end > 이것이 자바다[신용권 한빛미디어]' 카테고리의 다른 글

StringTokenizer 클래스  (0) 2021.10.24
String 클래스  (0) 2021.10.23
System 클래스  (0) 2021.10.23
Objects 클래스  (0) 2021.10.22
Object 클래스  (0) 2021.10.22