Skip to content

Latest commit

Β 

History

History
274 lines (198 loc) Β· 7.3 KB

2022-02-17-λͺ©.md

File metadata and controls

274 lines (198 loc) Β· 7.3 KB

3-2.λ¦¬ν”Œλ ‰μ…˜ API: μ–΄λ…Έν…Œμ΄μ…˜ 정보 쑰회

μ–΄λ…Έν…Œμ΄μ…˜ λ§Œλ“€κΈ°

public @interface MyAnnotation { ...}
  • 기본적으둜 μ–΄λ…Έν…Œμ΄μ…˜μ€ 주석과 같은 취급이닀. κ·Έλž˜μ„œ 클래슀 λ‘œλ”©λ˜μ–΄ λ°”μ΄νŠΈμ½”λ“œλ₯Ό 읽어 클래슀 정보가 λ©”λͺ¨λ¦¬μ— 올라갈 λ•Œ ν΄λž˜μŠ€μ— 뢙은 μ–΄λ…Έν…Œμ΄μ…˜ μ •λ³΄λŠ” μ œμ™Έν•˜κ³  μ˜¬λΌκ°„λ‹€.
  • λ©”λͺ¨λ¦¬μ— μ–΄λ…Έν…Œμ΄μ…˜ 정보도 ν•¨κ»˜ 올렀 λŸ°νƒ€μž„μ‹œμ—λ„ μœ μ§€ν•˜κ³  μ‹Άλ‹€λ©΄?
    • @Retention μ–΄λ…Έν…Œμ΄μ…˜ μ‚¬μš©

μ€‘μš” μ–΄λ…Έν…Œμ΄μ…˜

  • @Retention: ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜μ„ μ–Έμ œκΉŒμ§€ μœ μ§€ν•  것인가?
  • @Target: 어디에 μ‚¬μš©ν•  수 μžˆλŠ”κ°€? β†’ 클래슀, ν•„λ“œ, μƒμ„±μž ..
  • @Inherit: ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜μ„ ν•˜μœ„ ν΄λž˜μŠ€κΉŒμ§€ 전달할 것인가?
@Retention(RetentionPolicy.RUNTIME) //λŸ°νƒ€μž„μ‹œκΉŒμ§€ μœ μ§€
@Target({ElementType.TYPE, ElementType.FIELD}) //클래슀, ν•„λ“œμ— μ‚¬μš©
@Inherited
public @interface MyAnnotation { ...}

μ–΄λ…Έν…Œμ΄μ…˜μ— ν•„λ“œ μΆ”κ°€ν•˜κΈ°

  • μ–΄λ…Έν…Œμ΄μ…˜μ—λ„ ν•„λ“œλ₯Ό μΆ”κ°€ν•  수 μžˆλ‹€. ex) name, age ν•„λ“œ μΆ”κ°€

    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.TYPE, ElementType.FIELD})
    @Inherited
    public @interface MyAnnotation {
    
        String name();
    
        int age();
    }

    μ‚¬μš© 방법: μ–΄λ…Έν…Œμ΄μ…˜ μ‚¬μš©μ‹œ ν•„λ“œμ— 값을 맀번 μΆ”κ°€ν•΄ μ€˜μ•Ό ν•œλ‹€.
    @MyAnnotation(name = "chocho", age = 27)
    public class Book { ... }

  • default ν‚€μ›Œλ“œ

    • default ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ ν•„λ“œμ— κ°’ 섀정을 μƒλž΅ν•  경우 ν•„λ“œμ˜ default 값이 λ“€μ–΄κ°„λ‹€.
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.TYPE, ElementType.FIELD})
    @Inherited
    public @interface MyAnnotation {
    
        String name() default "chowon";
    
        int age() default 27;
    }

    μ‚¬μš© 방법
    @MyAnnotation
    public class Book { ... }
    

  • value ν‚€μ›Œλ“œ

    • ν•„λ“œλͺ…을 value둜 μ„€μ •ν•˜λ©΄ μ–΄λ…Έν…Œμ΄μ…˜μ— κ°’ μ„€μ •μ‹œ, ν•„λ“œλͺ…을 λͺ…μ‹œν•  ν•„μš”κ°€ μ—†λ‹€.
    • ν•„λ“œκ°€ ν•˜λ‚˜μΌ λ•Œ μœ μš©ν•˜λ‹€.
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.TYPE, ElementType.FIELD})
    @Inherited
    public @interface MyAnnotation {
    
        String value() default "chocho";
    }

    μ‚¬μš© 방법: ν•„λ“œλͺ…을 λͺ…μ‹œν•  ν•„μš” μ—†λ‹€.

    @MyAnnotation("chovly")
    public class Book { ...}

λ¦¬ν”Œλ ‰μ…˜ μ‚¬μš©ν•˜μ—¬ μ–΄λ…Έν…Œμ΄μ…˜ 정보 μ‘°νšŒν•˜κΈ°

1. 클래슀 μœ„μ— 뢙은 μ–΄λ…Έν…Œμ΄μ…˜ 쑰회

  • μ–΄λ…Έν…Œμ΄μ…˜μ— @Retention을 κΌ­ λΆ™μ—¬μ•Ό ν•œλ‹€.

    • 뢙이지 μ•ŠμœΌλ©΄ λ©”λͺ¨λ¦¬μ— 클래슀 정보가 올라갈 λ•Œ μ–΄λ…Έν…Œμ΄μ…˜ 정보가 μ œμ™Έλœλ‹€.
    // MyAnnotation.class
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.TYPE, ElementType.FIELD})
    @Inherited
    public @interface MyAnnotation {
    
        // defaultκ°€ μ—†μœΌλ©΄ μ–΄λ…Έν…Œμ΄μ…˜ μ„ μ–Έμ‹œ 직접 값을 맀번 μž…λ ₯해야함. μ•ˆ μ£Όλ©΄ μ—λŸ¬
        String name() default "chowon";
    
        int age() default 27;
    
        // 값을 ν•˜λ‚˜λ§Œ 받을 λ•Œ 유용
        String value() default "chocho";
    }
    
    // Book.class
    @MyAnnotation
    public class Book { ... }
    
    // Main.class
    public class Main {
    
        public static void main(String[] args) {
    
            Arrays.stream(Book.class.getAnnotations()).forEach(System.out::println);
            }
    }
    
    // result
    @chapter03.chapter03_2.MyAnnotation(name="chowon", value="chocho", age=27)

2. λΆ€λͺ¨ 클래슀의 μ–΄λ…Έν…Œμ΄μ…˜κΉŒμ§€ 쑰회

  • @Inhertλ₯Ό μ–΄λ…Έν…Œμ΄μ…˜μ— 뢙이면 μžμ‹ ν΄λž˜μŠ€μ—κ²ŒκΉŒμ§€ μ–΄λ…Έν…Œμ΄μ…˜μ΄ μ μš©λœλ‹€.

  • getAnnotations() ν˜ΈμΆœν•˜λ©΄ 자기 μžμ‹ μ—κ²Œ 뢙은 μ–΄λ…Έν…Œμ΄μ…˜ 뿐만 μ•„λ‹ˆλΌ, λΆ€λͺ¨ ν΄λž˜μŠ€μ— 뢙은 μ–΄λ…Έν…Œμ΄μ…˜λ„ 좜λ ₯λœλ‹€.

    // MyAnnotation.class
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.TYPE, ElementType.FIELD})
    @Inherited
    public @interface MyAnnotation {
    
        // defaultκ°€ μ—†μœΌλ©΄ μ–΄λ…Έν…Œμ΄μ…˜ μ„ μ–Έμ‹œ 직접 값을 맀번 μž…λ ₯해야함. μ•ˆ μ£Όλ©΄ μ—λŸ¬
        String name() default "chowon";
    
        int age() default 27;
    
        // 값을 ν•˜λ‚˜λ§Œ 받을 λ•Œ 유용
        String value() default "chocho";
    }
    
    // Book.class
    @MyAnnotation
    public class Book { ... }
    
    // MyBook.class
    @AnotherAnnotation
    public class MyBook extends Book {
    }
    
    // Main.class
    public class Main {
    
        public static void main(String[] args) {
    
            Arrays.stream(MyBook.class.getAnnotations()).forEach(System.out::println);
            }
    }
    
    // result
    @chapter03.chapter03_2.MyAnnotation(name="chowon", value="chocho", age=27)
    @chapter03.chapter03_2.AnotherAnnotation(name="chovly", value="princess bubblegum", age=30)

3. 상속받은 μ–΄λ…Έν…Œμ΄μ…˜ μ œμ™Έν•˜κ³  쑰회

  • getDeclaredAnnotations()

    • λΆ€λͺ¨ 클래슀둜 상속받은 μ–΄λ…Έν…Œμ΄μ…˜μ€ μ œμ™Έν•˜κ³  μžμ‹ μ—κ²Œλ§Œ 뢙은 μ–΄λ…Έν…Œμ΄μ…˜ 쑰회
    Arrays.stream(MyBook.class.getDeclaredAnnotations()).forEach(System.out::println);

4. ν•„λ“œμ— λΆ™μ–΄ μžˆλŠ” μ–΄λ…Έν…Œμ΄μ…˜ 쑰회

  • μ–΄λ…Έν…Œμ΄μ…˜ μƒμ„±μ‹œ @Target에 ElementType.FIELD μΆ”κ°€

    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.TYPE, ElementType.FIELD})
    @Inherited
    public @interface MyAnnotation {
    
        // defaultκ°€ μ—†μœΌλ©΄ μ–΄λ…Έν…Œμ΄μ…˜ μ„ μ–Έμ‹œ 직접 값을 맀번 μž…λ ₯해야함. μ•ˆ μ£Όλ©΄ μ—λŸ¬
        String name() default "chowon";
    
        int age() default 27;
    
        // 값을 ν•˜λ‚˜λ§Œ 받을 λ•Œ 유용
        String value() default "chocho";
    }
  • 그러면 μ–΄λ…Έν…Œμ΄μ…˜μ„ 클래슀의 ν•„λ“œμ— 뢙일 수 μžˆλ‹€.

    public class Book {
        private static StringB= "BOOK";
    
        private static final StringC= "BOOK";
    
        private String a = "a";
    
        @AnotherAnnotation // ν•„λ“œμœ„μ— μΆ”κ°€
        public String d = "d";
    
        @MyAnnotation // ν•„λ“œμœ„μ— μΆ”κ°€
        protected String e = "e";
    		
    		...
    }
  • 쑰회

    Arrays.stream(Book.class.getDeclaredFields()).forEach(f -> {
        Arrays.stream(f.getAnnotations()).forEach(System.out::println);
    });
    
    // result
    @chapter03.chapter03_2.AnotherAnnotation(name="chovly", value="princess bubblegum", age=30)
    @chapter03.chapter03_2.MyAnnotation(name="chowon", value="chocho", age=27)

4. μ–΄λ…Έν…Œμ΄μ…˜ 정보듀 κΊΌλ‚΄κΈ°

  • νŠΉμ • μ–΄λ…Έν…Œμ΄μ…˜ μ •λ³΄λ§Œ κΊΌλ‚Ό 수 μžˆλ‹€.

  • μ–΄λ…Έν…Œμ΄μ…˜μ˜ ν•„λ“œ 값을 κΊΌλ‚Ό 수 μžˆλ‹€.

    Arrays.stream(Book.class.getDeclaredFields()).forEach(f -> {
        Arrays.stream(f.getAnnotations()).forEach(a -> {
            if (a instanceof MyAnnotation) { // νŠΉμ • μ–΄λ…Έν…Œμ΄μ…˜λ§Œ 정보λ₯Ό 좜λ ₯
                MyAnnotation myAnnotation = (MyAnnotation) a;
                System.out.println("name = " + myAnnotation.name());
                System.out.println("age = " + myAnnotation.age());
            }
        });
    });
    
    // result
    name = chowon
    age = 27