hoonii2

[Java] 06. Local Class / Anonymous Class 본문

개념 공부/(개발) 01. Java

[Java] 06. Local Class / Anonymous Class

hoonii2 2022. 12. 2. 14:52

참고한 내용

https://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html

 

Local Classes (The Java™ Tutorials > Learning the Java Language > Classes and Objects)

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated

docs.oracle.com

https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

 

Anonymous Classes (The Java™ Tutorials > Learning the Java Language > Classes and Objects)

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated

docs.oracle.com

 

1. Local Class

: '{}' 사이에 명령문으로 정의된 Class 로 보통 Method 본문에 정의된다.

 

  1-1. 선언
  : 어디서든 '{}' 안에 Local Class 를 정의 가능 ( ex, Method 본문, for/if 문 내 등 )
 

  1-2. 둘러싼 Class 의 Member 에 접근
: Java SE 8 이후로 Local Class 가 속한 Class 의 멤버에 접근하는 방법이 변경된다.

 

    1) 둘러싼 Class 의 변수 접근 및 사용
  - SE 8 전엔 Final 로 지정된 변수만 사용할 수 있었지만, 이후엔 일반 변수도 사용할 수 있다.
  ※ 하지만 일반 변수의 값을 변경하는 구문이 어디든 있으면 안된다. ( 즉, Final 이라고 유추할 수 있는 변수만 사용이 가능하다. )

 

  - 섀도잉 및 Local Class
  : 동일한 변수명으로 둘러싼 Class 의 변수를 덮어서 사용할 수 있다.
  ※ Local Class 내 Method 의 멤버 변수 , Local Class 멤버 변수 , 둘러싼 Class 의 멤버 변수 출력 예제 ( 링크 )
 

  1-3. Local Class 는 Inner Class 와 유사한 점
  : Local Class 는 Static Member 를 정의 및 선언 불가한 것이 Inner Class 와 유사하다.

    1) Static Method 내에 Local Class 는 둘러싼 Class 의 Static Member 만 사용할 수 있다.
  ( 내 생각엔 Static Method 내에서 해당 Method 가 속한 Class 의 멤버를 사용하려면 해당 변수들이 Static 으로 선언되어야 한다는 의미로 보인다,, 아래 예제처럼 )

Class 둘러싼Class {
  Static int x = 10;
 
  Static public void 정적Method테스트 {
    Class 내부Class {
      System.out.println(x);
    }
  }
}

    2) Local Class 는 인스턴스된 둘러싼 Class 내에 Member 에 접근할 수 있으므로 Non-Static 이다.
  즉, Local Class 는 대부분의 Static 선언을 포함할 수 없다.
 

    3) 위의 결과로 Interface 또한 Local Class 및 메소드에서 선언할 수 없다.
  Interface 는 static 으로 동작하기 때문이다. ( 링크 )

Class 둘러싼Class {
  public void Method {
    Interface MethodInterface { // 불가능
    }

    Class 내부Class {
      Interface 내부ClassInterface { // 불가능
      }
      Static void Method {  // 불가능
      }

    4) Local Class 내에 Constant 변수 ( 'Primitive Type' or 'String' ) 를 Static Member 로 제공할 수 있다.

Class 둘러싼Class {
  public void Method {
    Class 내부Class {
      public static final String 파이널스트링 = "최종본";
      public void 출력() {
        System.out.println(파이널스트링);
      }
    }
    내부Class 내부Class인스턴스 = new 내부Class();
    내부Class인스턴스.출력();
  }
}

 

 

2. Anonymous Class

: Class 선언 (생성) 과 동시에 인스턴스화 할 수 있다.
: Class 이름이 없는 것은 Local Class 와 동일하지만 Local Class 를 한 번만 사용하는 경우 Anonymous Class 를 사용한다.
 

  2-1. 선언
  : Local Class 는 선언이지만 Anonymous Class 는 표현식으로, 다른 표현식에서 클래스를 정의한다.
 

  2-2. 구문 ( Syntax )
  : Local Class 와 유사하지만 인스턴스화 시 내용을 수정 및 작성한다.
 

class 둘러싼Class {
  Interface ClassInterface {
    public void methodtest();
  }
  public void Method() {
    class 내부Class {
      public void methodtest() {
        System.out.println("내부 Class");
      }
    }
    ClassInterface AnonymousClass1 = new ClassInterface() {
      public void methodtest() {
        System.out.println("익명 Class 1");
      }
    };
    ClassInterface AnonymousClass2 = new ClassInterface() {
      public void methodtest() {
        System.out.println("익명
Class 2");
      }
    };
  }
}
   
  - new Operator
  - Implement 하고자하는 Interface 혹은 extend 하고자하는 Class 이름을 지정 ( 위에선 ClassInterface Interface 사용 )
  - Interface 는 생성자가 없으므로 (생성 불가) '()' 빈 괄호로 매개변수를 할당한다.
  - '{}' Body 는 선언 Body 이다. 여기엔 Method 선언 (Declaration) 은 허용되지만, 문장 (Statement) 은 허용되지 않는다.
  ※ 왜냐면, Anonymous Class 정의는 표현식이고, 이는 문장 안에 포함된다. 위 예에서도 AnonymousClass1,2 객체 인스턴스화하는 문장 안에 포함된다. ( 그래서 '}' 이후 ';' 을 붙이는 이유이다 )

  표현식과 문장이 명확히 구분이 안되어서 이와 관련된 사항을 좀 더 찾아서 정리해봐야 할 것 같다.
( 링크 )
  2-3. 같은 Scope 의 지역 변수에 접근, Anonymous Class 의 멤버 선언 및 접근
  : Local Class 와 Anonymous Class 는 변수를 Capture 할 수 있다.
  : 이들이 속한 Scope 의 Local 변수에 동일한 접근성을 갖는다.
  • Anonymous Class 는 이들이 속한 Class 의 멤버에 접근할 수 있다.
  • Anonymous Class 는 final / 유추할 수 있는 final (초기 선언 후 수정 문이 없는 변수) 로 선언되지 않은 멤버에는 접근할 수 없다.
  • 섀도잉을 통해 속한 Class 의 변수명을 동일하게 하여 사용할 수 있다.

  : Anonymous Class 는 멤버에 관하여 Local Class 와 동일한 제약을 갖는다.

  • Anonymous Class 내에 Static initializer 혹은 interface member 를 선언할 수 없다.
  • 하지만 Anonymous Class 는 불변하는 변수 (constant variables: Premitive Type / String ) 의 Static Member 를 포함할 수 있다.

  : Anonymous Class 내에 선언할 수 있는 것

  • 필드
  • Extra Methods ( Supertype, 상위 구현의 어떠한 메소드를 구현하지 않더라도 )
    : 아마 상위 implement 나 extends 에서 선언한 메소드 이외에 더 선언할 수 있다는 의미로 보인다.
  • Instance Initializers ( 인스턴스 초기화 블럭 )
  • Local Class
    ※ 하지만, Anonymous Class 의 생성자는 선언할 수 없다.
     
Comments