사용자 도구

사이트 도구


wiki:java:코드조작

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

다음 판
이전 판
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/lib에 있는 코어 자바 API를 제공하며 최산위 우선순위를 가진 클래스 로더
 +  * 플랫폼 클래스 로더(Extension 클래스 로드): JAVA_HOME/lib/ext 폴더 또는 java.ext.dirs 시스템 변수에 해당하는 위치에 있는 클래스를 읽는다
 +  * 애플리케이션 클래스 로더: 애플리케이션 클래스패스(-classpath, java.class.path, 환경 변수의 값에 해당하는 위치)에서 클래스를 읽는다.
 +
 +:-P ClassFileNotFoundException은 클래스 로드가 못 찾는 것
 +
 +==== 링크 ====
 +Verify, Prepare, Resolve(optional)
 +  * 검증: .class 파일 형식이 유효한지 체크한다.
 +  * Preparation: 클래스 변수( static 변수)와 기본값에 필요한 메모리 확보
 +  * Resolve: 심볼리 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체한다.
 +
 +==== 초기화 ====
 +Static 변수의 값을 할당한다. (static 블럭이 있다면 실행 된다)
  
  
줄 53: 줄 76:
 ==== 바이트 코드 보기 ==== ==== 바이트 코드 보기 ====
 <code bash> <code bash>
-$> javap -c ${클래스 파일 경로}+$> javap -c -v ${클래스 파일 경로} // -v 애노테이션 정보도 볼 수 있음
 Compiled from "CodeManipulationApplication.java" Compiled from "CodeManipulationApplication.java"
 public class com.repia.java.codemanipulation.CodeManipulationApplication { public class com.repia.java.codemanipulation.CodeManipulationApplication {
줄 72: 줄 95:
 } }
 </code> </code>
 +
 +
 +===== 리플렉션 =====
 +
 +
 +
 +
 +
 +==== 스프링 Dependency Injection ====
 +어떻게 동작할까?
 +
 +
 +
  
 {{tag>주레피 manipulation}} {{tag>주레피 manipulation}}
/volume1/web/dokuwiki/data/attic/wiki/java/코드조작.1651127068.txt.gz · 마지막으로 수정됨: 2022/04/28 15:24 저자 dhan