-
Notifications
You must be signed in to change notification settings - Fork 0
이경민 3주차 학습일지
KyungMin Lee edited this page Jul 12, 2024
·
2 revisions
Annotations that apply to other annotations are called meta-annotations. 다른 어노테이션에 적용되는 어노테이션을 메타 어노테이션이라고 합니다.
-
자바에서 어노테이션을 사용할때 어노테이션에 적용되는 어노테이션을 메타 어노테이션이라고 표현합니다.
-
자바에서 기본적으로 제공해주는 메타 어노테이션들!
-
@Target
: 어노테이션을 적용할 수 있는 대상을 선정해줍니다.- JLS에서 지정한 9개의 컨텍스트에 대해서만 정해줄 수 있어요!
-
@Retention
: 컴파일러가 어노테이션을 얼마나 오래동안 유지시켜야 하는지를 알려줍니다.-
SOURCE
: 소스 레벨에서만 유지되고 컴파일 단계에서부터 무시됩니다. -
CLASS
: 컴파일까지 유지되고 JVM에서는 무시됩니다. -
RUNTIME
: 런타임 환경에서도 사용 가능하도록 JVM에 의해 유지됩니다.
-
-
@Inherited
: 어노테이션이 슈퍼 타입에 적용되는 경우 하위 타입에서 상속되어야 함을 명시합니다. -
@Deprecated
: 어노테이션(이나 적용된 다른 컨텍스트)를 더 이상 사용하면 안됩을 명시합니다. -
@Documented
: Javadoc을 사용해 문서화해야함을 명시합니다. -
@Repeatable
: 동일한 컨텍스트에 대해 동일한 어노테이션을 한번 이상 적용할 수 있음을 나타냅니다. - JAVA 8이상
-
-
메타 어노테이션을 만들어보자!
-
Test.java
@Target(value = ElementType.ANNOTATION_TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Test { }
-
InfoTest.java
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Test public @interface InfoTest { }
-
이 경우
@Test
는@InfoTest
의 메타 어노테이션일까? ✅-
What Are Meta-Annotations in Java? - DZone에 나온 방식으로
AnnotationHandler
,AnnotationProcessor
를 구성하고Temp
class를 만들어@InfoTest
를 적용하면?public class Main { public static void main(String[] args) throws Exception { AnnotationProcessor annotationProcessor = new AnnotationProcessor(); annotationProcessor.registerHandler(InfoTest.class, annotation -> System.out.println("InfoTest annotation found!")); annotationProcessor.registerHandler(Test.class, annotation -> System.out.println("Test annotation found!")); annotationProcessor.process(Temp.class); } } ----------------------------------------------------------------- > Task :Main.main() InfoTest annotation found! Test annotation found!
-
@InfoTest
만 적용했지만@Test
어노테이션도 적용됨을 확인할 수 있다!
-
-
출처
- 정의
- 컴퓨터가 Java 바이트코드로 컴파일된 컴퓨터 언어로 작성된 프로그램을 실행할 수 있게 해주는 가상 머신
- 플랫폼에 독립적인 실행 환경을 제공합니다.
- 컴퓨터 언어 → Java ByteCode Compile → JVM 실행
- 역할
- 플랫폼 독립성 제공: 어느 운영체제에서도 자바 프로그램이 동일하게 실행될 수 있게 한다.
- 메모리 관리: GC를 활용해서 메모리 관리를 한다!
- 실행 환경 제공: 런타임 환경을 제공한다!
-
클래스 로더 시스템
- Loading
- 클래스 로더가
.class
파일을 읽고 해당 바이너리 데이터를 생성하여 메서드 영역에 저장!- 바로 위 부모 클래스와 현제 클래스의 정규화된 이름
- 클래스, 인터페이스, Enum 여부
- Modifier, 변수, 메서드 정보
- 클래스 로더가
- Linking
- Verify, Prepare, Resolve를 수행해요!
- Verify:
.class
파일의 정확성 보장하기! → 작업이 완료되면 컴파일 할 준비가 됨을 의미합니다! - Prepare: static 변수를 메모리에 할당하고 메모리를 기본 값으로 초기화하기!
- Resolve: 기호 참조를 직접 참조로 대체하는 과정입니다! → 메서드 영역 검색해서 참조된 엔티티를 찾아서 대체하기! (ex. 바이트코드에서
#21
,#22
)
- Verify:
- Verify, Prepare, Resolve를 수행해요!
- Initialization
- 코드 내의 static block과 정적 변수에 정의된 값이 할당된다! 부모에서 자식으로!
-
Bootstrap Class Loader
: 핵심 자바 API 클래스를 로드합니다(java.lang.Object
,Class
, etc…) → 네이티브 언어로 구현되어 있어요! -
Extension Class loader
: 부트스트랩 클래스 로더의 자식 클래스 로더! 시스템 속성에 의해 정의된 클래스를 로드! → JAVA로 구현! -
System/Application Class Loader
: 확장 클래스 로더의 자식 클래스 로더! → 애플리케이션 클래스 경로에서 클래스를 로드합니다!
-
- 코드 내의 static block과 정적 변수에 정의된 값이 할당된다! 부모에서 자식으로!
- Loading
-
메모리 영역
- Method Area
- 정적 변수를 포함하여 클래스 이름, 바로 윗 부모 클래스 이름, 메서드 및 변수 정보 등과 같은 모든 클래스 레벨 정보가 저장되는 영역
- JVM당 하나의 메서드 영역만 있으며 공유 자원
- Heap Area
- 애플리케이션에서 생성된 모든 객체를 저장
- JVM당 하나의 힙 영역만 존재하며 공유 자원으로 사용됨
- Heap Area가 넘치면 OutOfMemory!
- Stack Area
- 로컬 변수와 메서드 정보를 저장함
- 스레드 실행을 위해 사용되요!
- 스택에 존재하는 스레드에 대해서도 스택 메모리가 존재합니다 → 요놈은 GC가 아니라 JVM에서 관리해요!
- 스택 메모리는 고정된 크기를 갖습니다 → 런타임에서 JVM을 통해 결정 → 그럼 부족하면? OutOfMemory!
- PC Registers
- 스레드에서 현재 실행할 명령의 주소가 저장됨
- 각 스레드별로 PC 레지스터를 가짐
- Native Method Stacks
- 네이티브 메소드: Java가 아닌 다른 프로그래밍 언어로 작성된 메서드 → 바이트코드로 컴파일 되지 않아서 다른 메모리영역을 써야 해요!
- 네이티브 메소드 전용 메모리 영역: Native Method Stacks
- 목적: 네이티브 메소드의 실행을 추적하자!
- Method Area
-
실행 엔진
- 인터프리터
- JIT Compiler
- GC