문서의 선택한 두 판 사이의 차이를 보여줍니다.
| 다음 판 | 이전 판 | ||
|
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> | ||