반응형

[Oracle Java Tutorial을 읽고 순서에 의해 정리한 후 본인의 경험과 이해를 바탕으로 작성된 글임을 밝힌다.]

[Java Tutorial, 자바 프로그래밍 기초 배우기, Java Programming, 자바 튜토리얼]

Annotation

메타데이터의 형식인 어노테이션(주석)은 프로그램 자체의 부분이 아닌 프로그램에 대한 데이터를 제공한다. 어노테이션은 어노테이션이 달려있는 코드의 작동에 직접적인 영향이 없다.

주석 기초 (Annotations Basics)

주석의 형태 (The Format of an Annotation)

최고로 간단한 형태 내에 어노테이션은 아래와 같이 보인다.

@Entity

@ 사인 글자는 다음으로 어노테이션임을 컴파일러에게 알린다. 아래 예제에서 어노테이션 이름은 override 이다.

@Override

 void mySuperMethod() {…}

어노테이션은 아래와 같은 요소들의 값에 이름이 있거나 없거나 할 수 있는 요소를 포함할 수 있다.

@Author(

    Name = “Benjamin”,

    Date = “3/27/2009”

)

 class MyClass() {…}

또는

@SuppressWarnings(value = “unchecked”)

  void myMethjod() {…}

만약 vaule로 이름 지어진 하나의 원소만 있다면 그 이름은 생략될 수 있다.

@SuppressWarnings(“unchecked”)

  void myMethod(){…}

만약 어노테이션이 원소가 없다면 괄호도 생략될 수 있다.

@Override example.

같은 선언에서 멀티 어노테이션을 사용 가능하다.

@Author(name = “Jane one”)

@EBook

  class MyClass{…}

만약 어노테이션이 같은 타입을 가지고 있다면 반복 어노테이션이라고 불린다.

@Author(name = “Jane”)

@Author(name = “John”)

  class MyClass{…}

반복 어노테이션은 Java 8 버전에서 지원된다.

 

 

어노테이션 타입은 Java SE APIjava.lang 또는 java.lang.annotation 패키지에 정의된 타입 중 하나일 수 있다.

이 전 예제에서 Override 와 SuppressWarniongs는 미리 정의 된 Java 어노테이션이다. 물론 자제로 만든 어노테이션 타입 정의도 가능하다.

어디서 어노테이션을 사용하는가? (Where Annotations Can Be Used)

어노테이션은 선언에 적용될 수 있다. 클래스, 필드, 메서드 그리고 다른 프로그램 원소들의 선언.

선언에서 사용할 때 각 어노테이션은 관례에 따라 그 자신의 라인에 종종 나타난다.

자바 8에서 어노테이션은 타입의 사용에 적용될 수 있다.

클래스 인스턴스 생생 표현식 : new @Interned MyObject();

타입 캐스트 : myString = (@NonNull String) str;

절 구현 : class UnmodifiableList implements

@Readonly List<@Readnoly T> {…}

예외 처리 선언 : void monitorTemperature() throws @Critical TemperatureException {…}

반응형
반응형

[Oracle Java Tutorial을 읽고 순서에 의해 정리한 후 본인의 경험과 이해를 바탕으로 작성된 글임을 밝힌다.]

[Java Tutorial, 자바 프로그래밍 기초 배우기, Java Programming, 자바 튜토리얼]

익명 클래스 (Anonymous Classes)

익명 클래스는 여러분이 만드는 코드를 좀 더 간결하게 만들 수 있게 한다. 익명 클래스는 동시에 클래스를 선언하고 인스턴스화 할 수 있게 한다. 이름이 없는 것 빼고는 지역 클래스와 같다. 딱 한 번 지역 클래스 사용이 필요할 때 사용하면 된다.

익명 클래스 선언 (Declaring Anonymous Classes)

지역 클래스는 클래스 선언인 반면 익명 클래스는 표현이다. 이 말은 또 다른 표현으로 정의한다는 의미이다. 다음 예제는 지역 변수 frenchGreetingspanishGreeting 의 선언 구문에서 익명 클래스를 사용한다. 그러나 변수 ehglishGreeting의 초기화를 위해 지역 클래스를 사용했다.

   public class HelloWorldAnonymousClasses {

      interface HelloWorld {

         public void greet();

         public void greetSomeone(String someone);

      }

      public void sayHello() {

 

      class EnglishGreeting implements HelloWorld {

         String name = "world";

          public void greet() {

             greetSomeone("world");

          }

          public void greetSomeone(String someone) {

             name = someone;

             System.out.println("Hello " + name);

          }

       }

       HelloWorld englishGreeting = new EnglishGreeting();

       HelloWorld frenchGreeting = new HelloWorld() {

          String name = "tout le monde";

          public void greet() {

             greetSomeone("tout le monde");

          }

          public void greetSomeone(String someone) {

             name = someone;

             System.out.println("Salut " + name);

          }

       };

       HelloWorld spanishGreeting = new HelloWorld() {

          String name = "mundo";

          public void greet() {

             greetSomeone("mundo");

          }

          public void greetSomeone(String someone) {

             name = someone;

             System.out.println("Hola " + name);

         }

       };

       englishGreeting.greet();

       frenchGreeting.greetSomeone("Fred");

       spanishGreeting.greet();   

   }

   public static void main(String[] args) {

      HelloWorldAnonymousClasses myApp = new HelloWorldAnonymousClasses();

      myApp.sayHello();

    }

}

 

 

익명 클래스 문법 (Syntax Anonymous Classes)

앞에서 언급된 것처럼 익명 클래스는 표현이다. 익명 클래스 표현의 문법은 코드 블록에 클래스 정의가 포함된 것을 제외하고 생성자 호출과 비슷하다.

frenchGreetion 객체의 인스턴스화에 대해 생각해 보자.

    HelloWorld frenchGreeting = new HelloWorld() {

       String name = "tout le monde";

       public void greet() {

          greetSomeone("tout le monde");

       }

       public void greetSomeone(String someone) {

          name = someone;

          System.out.println("Salut " + name);

       }

    };

익명 클래스 표현은 아래 것들로 구성된다.

  • New 조작어

  • 구현할 인터페이스 또는 확장할 클래스의 이름. 이 예제는 익명 클래스는 인터페이스 HelloWorld를 구현한다.

  • 일반 클래스 인스턴스 생성 표현과 마찬가지로 생성자에 대한 인수를 포함하는 괄호

  • 인터페이스를 구현할 때 거기엔 생성자가 없다. 그래서 비어 있는 괄호를 사용한다.

  • 본문은 클래스 선언 본문이다. 좀 더 구체적으로 말하면 본문에서 메서드 선언은 허용되지만 구문은 아니다.

익명 클래스 정의는 표현이기 때문에 틀림없이 구문의 부분이다. 이 예제에서 익명 클래스 정의는 frenchGreeting 객체 인스턴스 구문의 부분이다. (중괄호를 닫을 땐 세미콜론을 붙여준다.)

 

반응형