심심한잉여의 잡동사니

[Java] 리플렉션 Class 클래스 본문

코딩일기/Java

[Java] 리플렉션 Class 클래스

심심한잉여 2022. 4. 11. 17:17
반응형

리플렉션이란
반사라는 것을 뜻하며 객체를 통해 클래스 정보를 분석하는 프로그램 기법이다.

클래스 파일의 위치나 이름만 있으면 해당 클래스의 정보를 얻어내고,
객체를 생성하는 것 또한 가능하게 해주는 프로그래밍 기법이다.

동적으로 객체를 생성하는 것이 가능해진다.


Class 클래스란?
리플렉션의 기초가 되는 클래스다.

공부를 하다가 취업을 하면 ~~.class 라는 문구를 많이 보게 되는데 신입의 경우 이것이 이해가 안될 수 도 있다.

인스턴스도 아니고 .class라니 햇갈릴만 하다 생각한다.

간단히 말을 하면 Class에 대한 구조정보를 가지고 있는 객체라고 보면 된다.

public class Test{

	public String test1;
	public String test2;

	public Test(){
    }
    
    public Test(String str1, String str2){
    	this.test1 = str1;
		this.test2 = str2;
    }
    
    public String getTest1(){}

}

이런 클래스가 있다고 가정해보자.

필드 2개와 생성자, 1개의 메소드를 가지고 있다.

즉, Class 클래스는 이런 클래스의 구조 자체를 하나의 클래스로 표현해 둔 클래스라는 것이다.

Class 클래스 내부의 메소드를 보면 getField(), getPackage() 등 클래스 안에 생성자, 필드, 패키지 등 클래스를 이루는 것을 get할 수 있는 메서드들이 있다.

이제 어느정도 Class 클래스에 대해 이해가 될 것이라 생각한다.

이 것을 실제로 사용해보면

//메인 부분 생략

Class test = Test.class;

for(Field field : test.getField()){
	System.Out.println(field.getName());
}

// test1, test2 출력

for(Constructor constructor : test.getConstructors()){
	System.out.print("개수 " + constructor.getParameterCount() + " = ");
    
    for(Class parameter : constructor.getParameterTypes()){ 
    	System.out.print(parameter.getName() + " / "); 
    }

}
// 개수 : 0 = 파라메터 없는 생성자 출력
// 개수 : 2 = java.lang.String / java.lang.String / 파라메터 있는 생성자 출력

위 코드와 같이 출력되는 모습을 볼 수 있으며 메소드정보도 동일하게 정보를 가져올 수 있게 된다.

getDeclared~() 이렇게 시작하는 메서드들은 접근제한자에 막힌 정보들에 대해 접근이 가능하게 해주는 메서드 이며
이것을 사용하는 것은 캡슐화에 어긋난다.

이 코드를 제외한다면 public 속성이 있는 정보들에 대해 가져온다고 생각하면 된다.

즉 리플렉션 Class 클래스의 경우 해당하는 클래스 정보를 가져오기 위해 나온 기법이며
이를 이용하여 생성자도 생성이 가능하다. 즉 동적으로 생성자 생성을 위해 사용한다 생각하면 된다.

이 포스팅을 통해 현업 코드를 좀 더 잘 봤으면 좋겠다.

 

 

반응형

'코딩일기 > Java' 카테고리의 다른 글

[Java] 자바 컬렉션(Collection) 구조 정리  (0) 2022.05.02
[JAVA] 어노테이션(Anotation)  (0) 2022.04.12
[JAVA]POJO, DTO, DAO, VO  (0) 2022.04.07
[JAVA] 추상 클래스 VS 인터페이스  (0) 2022.03.31
[JAVA] DTO와 VO  (0) 2022.03.30