Skip to content

이경민 3주차 학습일지

KyungMin Lee edited this page Jul 12, 2024 · 2 revisions

- ❓ meta-annotations 넌 누구냐!

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 어노테이션도 적용됨을 확인할 수 있다!

출처

- 🛠️ JVM 살펴보기

JVM은 무엇인가?

  • 정의
    • 컴퓨터가 Java 바이트코드로 컴파일된 컴퓨터 언어로 작성된 프로그램을 실행할 수 있게 해주는 가상 머신
    • 플랫폼에 독립적인 실행 환경을 제공합니다.
    • 컴퓨터 언어 → Java ByteCode Compile → JVM 실행
  • 역할
    • 플랫폼 독립성 제공: 어느 운영체제에서도 자바 프로그램이 동일하게 실행될 수 있게 한다.
    • 메모리 관리: GC를 활용해서 메모리 관리를 한다!
    • 실행 환경 제공: 런타임 환경을 제공한다!

아키텍처

  • 클래스 로더 시스템

    • Loading
      • 클래스 로더가 .class 파일을 읽고 해당 바이너리 데이터를 생성하여 메서드 영역에 저장!
        • 바로 위 부모 클래스와 현제 클래스의 정규화된 이름
        • 클래스, 인터페이스, Enum 여부
        • Modifier, 변수, 메서드 정보
    • Linking
      • Verify, Prepare, Resolve를 수행해요!
        • Verify: .class 파일의 정확성 보장하기! → 작업이 완료되면 컴파일 할 준비가 됨을 의미합니다!
        • Prepare: static 변수를 메모리에 할당하고 메모리를 기본 값으로 초기화하기!
        • Resolve: 기호 참조를 직접 참조로 대체하는 과정입니다! → 메서드 영역 검색해서 참조된 엔티티를 찾아서 대체하기! (ex. 바이트코드에서 #21, #22)
    • Initialization
      • 코드 내의 static block과 정적 변수에 정의된 값이 할당된다! 부모에서 자식으로!
        • Bootstrap Class Loader: 핵심 자바 API 클래스를 로드합니다(java.lang.Object, Class, etc…) → 네이티브 언어로 구현되어 있어요!
        • Extension Class loader: 부트스트랩 클래스 로더의 자식 클래스 로더! 시스템 속성에 의해 정의된 클래스를 로드! → JAVA로 구현!
        • System/Application Class Loader: 확장 클래스 로더의 자식 클래스 로더! → 애플리케이션 클래스 경로에서 클래스를 로드합니다!
  • 메모리 영역

    • 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
      • 목적: 네이티브 메소드의 실행을 추적하자!
  • 실행 엔진

    • 인터프리터
    • JIT Compiler
    • GC

👼 개인 활동을 기록합시다.

개인 활동 페이지

🧑‍🧑‍🧒‍🧒 그룹 활동을 기록합시다.

그룹 활동 페이지

🎤 미니 세미나

미니 세미나

🤔 기술 블로그 활동

기술 블로그 활동

📚 도서를 추천해주세요

추천 도서 목록

🎸 기타

기타 유용한 학습 링크

Clone this wiki locally