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 가질 수 있음