[Study-NextStep] 2022-02-20

jeonye·2022년 2월 19일
0

Study

목록 보기
8/8

일시 : 2022-02-20
범위 : 자바 웹 프로그래밍 Next Step 10장 실습(p333-p368)
목적 : 새로운 MVC 프레임워크 구현을 통한 점진적 개선
실습 : https://github.com/jeonye/jwp-basic/tree/practice-step8-self-check-completed

Realize

자바 리플렉션

리플렉션(Reflection)이란?

구체적인 클래스 타입을 알지 못해도, 클래스의 메소드, 타입, 변수들을 접근할 수 있도록 가능하게 해주는 자바 API

리플렉션(Reflection)
컴파일 시간(Compile Time)이 아닌 실행 시간(Run Time)에 동적으로
특정 클래스의 정보를 추출해낼 수 있는 프로그래밍 기법

필요성

동적으로 클래스를 사용해야할 때 필요하다.
작성 시점에는 어떤 클래스를 사용해야할 지 모르고, 런타임 시점에서 클래스를 가져와서 실행해야하는 경우에 사용된다.

JVM에서 실행되는 애플리케이션의 런타임 동작을 검사하거나 수정할 수 있는 기능이 필요한 프로그램에서 사용된다.
Ex) IntelliJ의 자동완성, Spring Framework의 Annotation 등

원리

Java에서는 모든 .class 파일 하나당 java.lang.Class 객체가 하나씩 생성된다. Class는 모든 .class들의 정보를 가지고 있으며, .class파일에 같이 저장된다.
모든 .class들은 이 클래스를 최초로 사용하는 시점에 ClassLoader를 통해 동적으로 JVM에 로드된다.
즉, .class의 static을 최초로 사용할 때, .class 정보와 Class 객체는 JVM에 Run Time Data Area의 Method Area에 저장된다.

자바 클래스 파일은 바이트 코드로 컴파일되어 Static 영역에 위치하게 된다. 이러한 이유로 클래스 이름만 알고 있다면, 언제든지 이 Static 영역을 뒤져서 클래스에 대한 정보를 가져올 수 있다.

이러한 정보들이 java.lang.reflect에서 접근할 수 있게 도와준다.

Run Time Data Area 관련 블로그
https://www.holaxprogramming.com/2013/07/16/java-jvm-runtime-data-area/

<참고>
[Java/자바] - 리플렉션(Reflection)
[JAVA] 자바 리플렉션(Java Reflection)

Map 반복문

Map의 객체 수만큼 반복문을 수행하고 싶을 경우 Iterator를 사용해야만 하는줄 알았다.

Map<Class<?>, Object> controllers = new HashMap<>();
try {
	Iterator<Class<?>> annotatedIterator = annotated.iterator();
	while (annotatedIt.hasNext()) {
		Class clazz = annotatedIt.next();
		controllers.put(clazz, clazz.newInstance());
	}
} catch (InstantiationException | IllegalAccessException e) {
	log.error(e.getMessage());
}

아니었다. for문을 이용하여 반복문을 수행할 수 있다.
(Java8 부터는 forEach를 사용할 수 있다.)

Map<Class<?>, Object> controllers = new HashMap<>();
try {
	for(Class<?> clazz : annotated) {
		controllers.put(clazz, clazz.newInstance());
	}
} catch (InstantiationException | IllegalAccessException e) {
	log.error(e.getMessage());
}

객체 선언

아래 두가지의 객체 선언 방법은 무엇이 다를까?
① Map<String, Object> map = new HashMap<>();
② Map<String, Object> map = Maps.newHashMap();

②번 방법은 Google Guava 라이브러리를 통한 선언 방법이다.
Guava는 가독성 있는 코드를 작성하기 위해 많은 유틸 클래스를 제공하는 '자바용 공통 라이브러리의 오픈 소스 집합'이다.

▶︎ 컬렉션 생성
final Map<String, Map<String, Integer>> lookup = new HashMap<String, Map<String, Integer>>();

▶︎ in Java 7
final Map<String, Map<String, Integer>> lookup = new HashMap<>();

▶︎ in Guava
final Map<String, Map<String, Integer>> lookup = Maps.newHashMap();

Guava에 대한 자세한 내용은 Guava를 써야하는 5가지 이유[자바] Guava 를 이용한 코드 작성 블로그에서 확인 가능하다.

0개의 댓글