반응형

[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 객체 인스턴스 구문의 부분이다. (중괄호를 닫을 땐 세미콜론을 붙여준다.)

 

반응형
반응형

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

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

지역 클래스 (Local Classes)

로컬(지역) 클래스(Local classes)는 중괄호{ } 사이에 0개 또는 그 이상의 구문의 그룹이 있는 블록에 정의된 클래스다. 일반적으로 메서드의 몸체에서 지역변수가 정의된 걸 찾을 수 있다.

지역 클래스는 내부 클래스와 닮았다(Local Classes Are Similar To Inner Classes)

지역 클래스는 어떤 static 멤버를 선언이나 정의할 수 없는 이유로 내부 클래스와 닮았다.

vaildatePhoneNumber static메서드에서 정의된 PhoneNumber 클래스 같은 static메서드내 지역 클래스는 감싸고 있는 클래스의 static멤버만 참조할 수 있다. 예를 들어 만약 static으로 regularExpression 멤버변수를 선언하지 않았다면 자바 컴파일러는 non-static 변수인 regularExpressionstatic구문에서 참조될 수 없다. 라는 비슷한 에러 메시지를 만든다.

지역 클래스는 non-static이다. 왜냐하면 포함된 블록의 인스턴스 멤버에 접근권이 있기 때문이다. 그 결과 대부분 static으로 선언된 종류들을 포함할 수 없다.

인터페이스는 본질적으로 static이라서 블록 내에 인터페이스를 선언할 수 없다. 예를 들어 아래 발취된 코드는 컴파일되지 않는다. 왜냐하면 인터페이스 HelloTheregreetInEnglish 메서드의 몸체 내에 정의되어 있다.

    public void greetInEnglish(){

       interface HelloThere {

          public void greet();

       }

       class EnglishHelloThere implements HelloThere {

            public void greet(){

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

           }

      }

      HelloThere myGreeting = new EmglishHelloThere();

      myGreeting.greet();

    }

 

 

지역 클래스에서 static을 초기화 하는 부분 또는 멤버 인터페이스를 선언할 수 없다. 아래 발췌된 소스도 컴파일되지 않는다. 왜냐하면 EnglishGoodbye 메서드 때문이다. sayGoodbyestatic로 선언되어 있다. Static은 오직 상수 선언시만 허용된다.라는 비슷한 오류 메시지를 만들 것이다.

    public void sayGoodbyeInEnglish(){

       class EnglishGoodbye() {

          public static void sayGoodbye(){

             System.out.println(“Bye bye”);

         }

      }

      EnglishGoodbye.sayGoodbye();

    }

지역 클래스는 상수로 제공되는 static 멤버를 가질 수 있다. EnglishGoodbye static멤버이기 때문에 아래 발췌 코드는 컴파일된다.

farewell은 상수다.

    public void sayGoodbyeInEnglish(){

       class EnglishGoodbye{

           public static final String farewell = “Bye bye”;

           public void sayGoodBye(){

               System.out.println(farewell);

           }

       }

        EnglishGoodbye myEnglishGoodbye = new EnglishGoodbye(); 

        myEnglishGoodbye.sayGoodbye()’

   }

 

반응형