item 39 dodo4513 - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

μ•„μ΄ν…œ39 λͺ…λͺ… νŒ¨ν„΄λ³΄λ‹€ μ• λ„ˆν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λΌ

  • μ „ν†΅μ μœΌλ‘œ λ„κ΅¬λ‚˜ ν”„λ ˆμž„μ›Œν¬κ°€ νŠΉλ³„νžˆ 닀뀄야 ν•  ν”„λ‘œκ·Έλž¨ μš”μ†Œμ—λŠ” λ”± κ΅¬λΆ„λ˜λŠ” λͺ…λͺ… νŒ¨ν„΄μ„ μ μš©ν•΄μ™”λ‹€. μ˜ˆμ»¨λŒ€ ν…ŒμŠ€νŠΈ ν”„λ ˆμž„μ›Œν¬μΈ JUnit은 버전 3κΉŒμ§€ ν…ŒμŠ€νŠΈ λ©”μ„œλ“œ 이름을 test둜 μ‹œμž‘ν•˜κ²Œλ” ν–ˆλ‹€.

λͺ…λͺ… νŒ¨ν„΄μ˜ 단점

  1. μ˜€νƒ€κ°€ λ‚˜λ©΄ μ•ˆλœλ‹€. λ§Œμ•½ 개발자의 μ‹€μˆ˜λ‘œ μ˜€νƒ€κ°€ λ°œμƒν•˜λ”λΌλ„ 이λ₯Ό κ²€μ¦ν•˜κΈ°κ°€ 쉽지 μ•Šλ‹€.
  2. μ˜¬λ°”λ₯Έ ν”„λ‘œκ·Έλž¨μ˜ μš”μ†Œμ—μ„œλ§Œ μ‚¬μš©λ˜λ¦¬λΌ 보증할 방법이 μ—†λ‹€. 예λ₯Ό λ“€μ–΄ λ©”μ„œλ“œμ—μ„œλ§Œ μ‚¬μš©κ°€λŠ₯ν•œ λͺ…λͺ… νŒ¨ν„΄μ„ 클래슀 λͺ…에도 μ‚¬μš©ν•˜μ§€ λͺ»ν•˜κ²Œ κ°•μ œν•  수 μžˆλŠ” 방법이 μ—†λ‹€.
  3. ν”„λ‘œκ·Έλž¨ μš”μ†Œλ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ 전달할 λ§ˆλ•…ν•œ 방법이 μ—†λ‹€. 이름 μ˜†μ— 함꼐 λΆ™μ—¬μ„œ 전달할 μˆ˜λ„ μžˆκ² μ§€λ§Œ, 보기도 λ‚˜μ˜κ³  꺠지기도 쉽닀.

μœ„ 단점을 λͺ¨λ‘ ν•΄κ²°ν•΄μ£ΌλŠ” μ• λ„ˆν…Œμ΄μ…˜!

import java.lang.annotation.*;
/**
* ν…ŒμŠ€νŠΈ λ©”μ„œλ“œμž„μ„ μ„ μ–Έν•˜λŠ” μ• λ„ˆν…Œμ΄μ…˜μ΄λ‹€.
* λ§€κ°œλ³€μˆ˜ μ—†λŠ” 정적 λ©”μ„œλ“œ μ „μš©μ΄λ‹€.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Test {
}
  • μœ„μ²˜λŸΌ μ• λ„ˆν…Œμ΄μ…˜ 선언에 λ‹€λŠ” μ• λ„ˆν…Œμ΄μ…˜μ„ λ©”νƒ€μ• λ„ˆν…Œμ΄μ…˜(meta-annotation)이라 ν•œλ‹€. @Retention(RetentionPolicy.RUNTIME) λ©”νƒ€μ• λ„ˆν…Œμ΄μ…˜μ€ @Testκ°€ λŸ°νƒ€μž„μ—λ„ μœ μ§€λ˜μ–΄μ•Ό ν•œλ‹€λŠ” ν‘œμ‹œλ‹€. λ§Œμ•½ 이 λ©”νƒ€μ• λ„ˆν…Œμ΄μ…˜μ„ μƒλž΅ν•˜λ©΄ ν…ŒμŠ€νŠΈ λ„κ΅¬λŠ” @Testλ₯Ό 인식할 수 μ—†λ‹€. ν•œνŽΈ, @Target(ElementType.METHOD) λ©”νƒ€μ• λ„ˆν…Œμ΄μ…˜μ€ @Test κ°€ λ°˜λ“œμ‹œ λ©”μ„œλ“œ μ„ μ–Έμ—μ„œλ§Œ μ‚¬μš©λΌμ•Ό ν•œλ‹€κ³  μ•Œλ €μ€€λ‹€. λ”°λΌμ„œ 클래슀 μ„ μ–Έ, ν•„λ“œ μ„ μ–Έ λ“± λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨ μš”μ†Œμ—λŠ” 달 수 μ—†λ‹€.

λ§€κ°œλ³€μˆ˜ ν•˜λ‚˜λ₯Ό λ°›λŠ” μ• λ„ˆν…Œμ΄μ…˜ νƒ€μž…

import java.lang.annotation.*;
/**
* λͺ…μ‹œν•œ μ˜ˆμ™Έλ₯Ό λ˜μ Έμ•Όλ§Œ μ„±κ³΅ν•˜λŠ” ν…ŒμŠ€νŠΈ λ©”μ„œλ“œμš© μ• λ„ˆν…Œμ΄μ…˜
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ExceptionTest {
    Class<? extends Throwable> value();
}

public class Sample2 {
@ExceptionTest(ArithmeticException.class)
public static void m1() { // 성곡해야 ν•œλ‹€.
    int i = 0;
    i = i / i;
}
@ExceptionTest(ArithmeticException.class)
public static void m2() { // μ‹€νŒ¨ν•΄μ•Ό ν•œλ‹€. (λ‹€λ₯Έ μ˜ˆμ™Έ λ°œμƒ)
    int[] a = new int[0];
    int i = a[1];
}
@ExceptionTest(ArithmeticException.class)
public static void m3() { } // μ‹€νŒ¨ν•΄μ•Ό ν•œλ‹€. (μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•ŠμŒ)
}

  • reflection 을 μ΄μš©ν•΄ value에 μ ‘κ·Όν•  수 있고 그에 따라 λ‹€λ₯Έ λ™μž‘μ„ κ΅¬ν˜„ν•  수 μžˆλ‹€.

정리

  • 이번 μ•„μ΄ν…œμ˜ ν…ŒμŠ€νŠΈ ν”„λ ˆμž„μ›Œν¬λŠ” μ•„μ£Ό κ°„λ‹¨ν•˜μ§€λ§Œ μ• λ„ˆν…Œμ΄μ…˜μ΄ λͺ…λͺ… νŒ¨ν„΄λ³΄λ‹€ λ‚«λ‹€λŠ” 점은 ν™•μ‹€νžˆ 보여쀀닀. ν…ŒμŠ€νŠΈλŠ” μ• λ„ˆν…Œμ΄μ…˜μœΌλ‘œ ν•  수 μžˆλŠ” 일 쀑 극히 일뢀일 뿐이닀. μ• λ„ˆν…Œμ΄μ…˜μœΌλ‘œ ν•  수 μžˆλŠ” 일을 λͺ…λͺ… νŒ¨ν„΄μœΌλ‘œ μ²˜λ¦¬ν•  μ΄μœ λŠ” μ—†λ‹€.