LocalClass & Annonymous Class

man soup·2020년 6월 7일
0

자바 문법

목록 보기
3/15

Local Class

  • 블록( { 여기 } ) 안에 정의된 클래스
  • 보통 함수 정의 문 안에서 볼 수 있음

Accessing Members of an Enclosing Class

  • local class를 둘러싼 outer class의 멤버에 접근 가능하다

  • enclosing block에 존재하는 지역 변수도 접근할 수 있는데 이때 지역 변수는 final이거나 effectively final(생성 후 값 변하지 않는 변수)이어야 한다. 접근된 변수를 captured variable라고 한다.

  • captured variable : nested class 에서 사용하기 위해 복사된 변수

    • 왜 복사? : 함수가 모두 수행되어 함수 내의 지역 변수 모두 stack에서 삭제된 경우에도 nested object는 객체화 되어 heap영역에 존재할 수 있기때문
    • 왜 final? : concurrency 문제 해결 위해

Local Classes Are Similar To Inner Classes

  • static 맴버 선언 불가능
  • static 함수 안의 local class는 enclosing class의 static 멤버만 접근 할 수 있다.
  • 대부분의 static 선언들을 포함할 수 없다
    • 인터페이스는 본질적으로 static이므로 block안에서 선언할 수 없다.
  • static initializer(static 키워드 붙은 { } ) 나 멤버 인터페이스를 local class 안에서 선언할 수 없다.
  • static 맴버를 가질 수 있는 예외 존재
    • 상수인 변수( ex : static final String str = "bye bye")

Anonymous Classes

  • 코드를 간결하게 해준다.
  • 클래스의 선언과 객체화를 동시에 해준다.
  • 이름 없는 local class라고 보면 됨
  • local class가 한번만 필요한 경우에 사용

Declaring Anonymous Classes

  • anonymous class는 expression이다( -> 어떤 value를 return 한다. )

Syntax of Anonymous Classes

  • 생성자를 깨우는 것과 비슷
  • class 정의가 {}블록안에 존재
  • anonymous class expression에 포함되는 것들
    • new operator
    • implement 할 인터페이스 또는 extend할 class의 이름
    • 생성자에게 전달할 아규면트들을 포함한 괄호 ( class 객체 생성 expression같이, 인터페이스를 implement 할 경우 생성자가 원래 없으므로 빈 괄호 사용 )
    • 클래스 선언부인 body 부분 ( body 안에는 함수 선언부는 가능하지만 statement는 불가능하다 -?? )
  • anonymous class 정의는 expression 이기 때문에 statement의 부분이여야 한다. (보통 어떤 객체를 인스턴스화 하는 statement의 일부분) -> 그래서 항상 마지막부분에 세미콜론 존재

Accessing Local Variables of the Enclosing Scope, and Declaring and Accessing Members of the Anonymous Class

  • local class와 마찬가지로 capture variables 가능
    • enclosing class의 멤버에 접근 가능
    • final 아닌 enclosing scope의 지역 변수 접근 불가능
    • nested class에서 처럼 type 선언시 enclosing scope에 존재하는 같은 이름의 type을 shadowing 한다.
  • static initializer 나 맴버 인터페이스 선언(정의) 불가능
  • 상수 static 멤버 가질 수 있음
  • 생성자 선언 불가능
  • 필드, extra 함수들, instance initializer, local class 가질 수 있음
profile
안녕하세요

0개의 댓글