< 내부 인터페이스 >
=> 외부 클래스 전용 내부 인터페이스
class A { interface B { } }
=> 구현은? A 에서는 못한다.
A 에 다른 내부클래스 C 를 만들어서 구현하고, C 를 가져다 쓰는 식
Class A { interface B { 메소드 }
class C implements B { 메소드 구현 } }
=> 내부 interface 의 경우, 이렇게 내부에 또다른 class 를 만들어서 구현하고 그걸 꺼내쓰고 하면서 불편해진다.
=> 그래서 " 익명의 객체" 를 사용할 수 있게 편의기능을 만들어 줬다.
class A { interface B { 메소드1, 메소드2 }
B b1 = new B( ) {
public void 메소드1( ) { 구현 }
public void 메소드2( ) { 구현 }
} ;
(1) 생긴건 앞 부분만 보면 사실상 그냥 인터페이스 B 를 객체화 시키는 모양하고 똑같다.
(2) 대신 { } 구현부가 추가되었고, 실제로 interface 메소드를 구현한다.
(3) 마지막으로, 구현부의 { } 괄호 끝에다가 ; 세미클론으로 마무리를 해준다.
=> 이렇게 하면, 일단 결과적으로는
interface B 의 메소드들이 다 구현이 되었고,
이를 다른 클래스에서 사용하고자 할때는 마찬가지로
( 내부 클래스를 사용하기 위해선 외부클래스에게 허락맡고 써야 했다. 외부객체생성 => 내부객체생성 => 사용 )
A a1 = new A( ); // 외부클래스 객체 생성
내부인터페이스 객체는?
=> 외부클래스 A 에서 이미 "익명객체스킬" 을 사용해서 b1 으로 만들어 놨었다.
class A { interface B { 메소드1, 메소드2 }
B b1 = new B( ) {
public void 메소드1( ) { 구현 }
public void 메소드2( ) { 구현 }
} ;
=> 그러므로, A 객체 a1 을 생성했으면, 그걸로 내부객체 b1 까지 사용할 수 있다.
a1. b1. 메소드1( );
a1. b1. 메소드2( ) ;
이렇게 편하게 사용하면 된다.
- < 익명의 객체 >
1. 인터페이스를 상속하는 가상의 클래스 하나를 (안보이게) 정의하고,
그 안에서 인터페이스 메소드들을 실제로 구현한다.
2. 동시에 그 가상 클래스의 (익명의객체) 까지 만들어줘버린다.
(익명클래스랑 객체가 다 생략으로 만들다보니, 모양새는 마치 interface를 객체화 하는 모양세가 되고 만 것
=> 오히려 편해 그냥 interface 객체화 하는 문법 + {구현}; 이라고 생각하면 편하다 )
( 안드로이드 앱 만들때 많이쓰임 )
이런 익명의 객체가 안보이게 편하게 쓰라고 도와주는구나 생각하고
저 위에, 문법 구조 (익명 객체 사용법) 를 익숙하게 해두는게 필요할 것 같다.