문서의 선택한 두 판 사이의 차이를 보여줍니다.
다음 판 | 이전 판 | ||
wiki:java:코드조작 [2022/04/28 15:24] dhan 만듦 |
wiki:java:코드조작 [2023/01/13 18:44] (현재) |
||
---|---|---|---|
줄 1: | 줄 1: | ||
====== 더 자바, 코드를 조작하는 다양한 방법 ====== | ====== 더 자바, 코드를 조작하는 다양한 방법 ====== | ||
- | |||
- | |||
- | |||
===== JVM(Java Virtual Machine) ===== | ===== JVM(Java Virtual Machine) ===== | ||
줄 26: | 줄 23: | ||
==== 클로스 로더 시스템 ==== | ==== 클로스 로더 시스템 ==== | ||
- | * 로딩 | + | * 로딩: 클래스의 메모리 로딩 |
- | * 링크 | + | * 링크: 클래스간 연결(레퍼런스 연결) |
- | * 초기화 | + | * 초기화: 각 클래스, 변수 초기화 |
==== 메모리 ==== | ==== 메모리 ==== | ||
줄 41: | 줄 38: | ||
==== 실행 엔진(Execution Engine) ===== | ==== 실행 엔진(Execution Engine) ===== | ||
- | * 인터프리터: | + | * 인터프리터: |
- | * JIT(Just In Time) 컴파일러: | + | * JIT(Just In Time) 컴파일러: |
- | JIT | + | JIT 컴파일러로 반복되는 코드를 모두 네이티브 코드로 바꿔둔다. 그 다음부터 인터프리터는 네이티브 코드로 컴파일된 코드를 바로 사용한다. |
* GC(Garbage Collector): 더 이상 참조되지 않는 객체를 모아서 정리한다. | * GC(Garbage Collector): 더 이상 참조되지 않는 객체를 모아서 정리한다. | ||
+ | ===== 클래스 로더 시스템 ===== | ||
+ | 로딩, 링크, 초기화 순으로 진행된다. | ||
+ | |||
+ | ==== 로딩 ==== | ||
+ | * 클래스 로더가 .class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들고 " | ||
+ | * 메소드 영역에 저장되는 데이터 | ||
+ | * FQCN: Fully Qualified Class Name | ||
+ | * 클래스 | 인터페이스 | ENUM | ||
+ | * 메소드와 변수 | ||
+ | * 로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하여 " | ||
+ | |||
+ | 클래스 로더 | ||
+ | * 부트 스트랩 클래스 로더: JAVA_HOME/ | ||
+ | * 플랫폼 클래스 로더(Extension 클래스 로드): JAVA_HOME/ | ||
+ | * 애플리케이션 클래스 로더: 애플리케이션 클래스패스(-classpath, | ||
+ | |||
+ | :-P ClassFileNotFoundException은 클래스 로드가 못 찾는 것 | ||
+ | |||
+ | ==== 링크 ==== | ||
+ | Verify, Prepare, Resolve(optional) | ||
+ | * 검증: .class 파일 형식이 유효한지 체크한다. | ||
+ | * Preparation: | ||
+ | * Resolve: 심볼리 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체한다. | ||
+ | |||
+ | ==== 초기화 ==== | ||
+ | Static 변수의 값을 할당한다. (static 블럭이 있다면 실행 된다) | ||
줄 53: | 줄 76: | ||
==== 바이트 코드 보기 ==== | ==== 바이트 코드 보기 ==== | ||
<code bash> | <code bash> | ||
- | $> javap -c ${클래스 파일 경로} | + | $> javap -c -v ${클래스 파일 경로} |
Compiled from " | Compiled from " | ||
public class com.repia.java.codemanipulation.CodeManipulationApplication { | public class com.repia.java.codemanipulation.CodeManipulationApplication { | ||
줄 72: | 줄 95: | ||
} | } | ||
</ | </ | ||
+ | |||
+ | |||
+ | ===== 리플렉션 ===== | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ==== 스프링 Dependency Injection ==== | ||
+ | 어떻게 동작할까? | ||
+ | |||
+ | |||
+ | |||
{{tag> | {{tag> |