728x90
Class 객체
- java.lang.Class
- 클래스는 모든 클래스의 메타 정보를 나타내는 클래스
- 클래스의 모든 정보 제공 : 생성자, 필드, 메서드, 접근 제어자,어노테이션 등등
- 클래스 당 1개만 존재
- Class 객체 자체 메서드 존재
- 원리
- Car class를 작성한 Car.java 파일이 존재
- 프로그램에서 참조변수로 해당 Car type을 부름
- Car.java -> compile -> Car.class : 컴파일 완료
- 컴파일 된 .class 파일은 한 파일(xxx.java) 내에 여러 class 클래스명{}들이 존재하더라도 compile시 각각의 파일(.class)로 나누어준다.
그래서 Class 객체가 클래스당 1개만 존재가 가능
- 컴파일 된 .class 파일은 한 파일(xxx.java) 내에 여러 class 클래스명{}들이 존재하더라도 compile시 각각의 파일(.class)로 나누어준다.
- ClassLoader라는 것을 통해서 (위의 과정과 같이 클래스 정보가 필요할 때 Class 객체를 생성) Class 객체 생성
- Class 객체 생성시 고유 class 이름과 package를 부여 - 다른 class와 구분이 가능
Class 객체를 통한 해당 type의 instance를 생성할 때 package키워드.class키워드 형식으로 뽑아내야함
- 클래스 이름: 클래스 정의에서 class 키워드 다음에 나오는 이름
- 패키지 이름: 클래스 정의에서 package 키워드 다음에 나오는 이름
- Class 객체 생성시 고유 class 이름과 package를 부여 - 다른 class와 구분이 가능
- 장점
- class 파일도 결국에는 객체 -> 정보와 메서드가 존재
- Car.java -> Car.class -> Method Area에 Car class 객체로 존재(Class 객체)
- Class 객체로 할 수 있는 것들
- 정보를 얻을 수 있다 - iv가 몇개인지, 메서드가 몇개인지 , 애노테이선, 등등 정보를 얻을 수 있다.
- 객체 생성
- 메서드 호출
- Class 객체로 할 수 있는 것을 활용해서 Reflection API 기능을 적용할 수 있다.
- Class 객체 얻는 방법
- Class carClass = new Car().getClass();
- Car car = new Car();
- Car car = carClass.newInstance(); -> 코드 변경이 필요시 동적으로 다른 클래스 객체를 만들 수 있도록 한다.
- Class carClass = Car.class;
- Class carClass = Class.forName(p.getProperty());
- Class carClass = new Car().getClass();
Reflection API
- 특징
- java.lang.reflect 패키지
- Class의 정보를 동적으로 가져오고, Class의 인스턴스를 생성하고,Class의 필드와 메소드에 접근하는 방법을 제공
- Reflection API는 java.lang.Class 클래스를 중심으로 동작
- Reflection API는 이 클래스를 사용하여 클래스의 정보를 가져온다.
== Reflection API를 사용하려면 먼저 해당 클래스의 java.lang.Class 객체를 가져와야한다.
- 핵심
- Reflection API는 java.lang.Class 객체를 사용하여 클래스의 정보를 나타내고 조작
- -> 컴파일 타임에는 알 수 없는 클래스의 정보를 런타임에 알아낼 수 있으며, 이를 활용하여 유연하고 동적인 프로그래밍 가능
- 예
- Car class Instance가 Object 타입의 참조변수와 연결되면 실제 Car class의 필드와 메서드를 사용 불가
- Reflection api의 기능을 이용(=Class 객체 이용) 해서 동적으로 Object 참조변수를 Car type으로 참조변수로 변경하지 않고도 Car 객체 내부의 값을 변경이 가능
- 참고 블로그 : https://tecoble.techcourse.co.kr/post/2020-07-16-reflection-api/
- 결론
- 어떤 type의 class가 오던지 간에 처리가 가능해지는 힘이 생긴다는 것을 의미
- 주로 프레임워크나 라이브러리에서 사용
- Spring의 DTO 때 reflectionAPI 적용
- Spring DI도 reflectionAPI 적용
- 더 깊게 알고 싶을 때 참고하면 좋은 블로그