GitHub

https://github.com/Backcoder-June

BackCoder 기록 그리고 숙달

카테고리 없음

내부 interface <= 익명객체로 편하게

Backcoder 2022. 7. 1. 13:07

< 내부 인터페이스 > 

=> 외부 클래스 전용 내부 인터페이스 
    
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 객체화 하는 문법 + {구현}; 이라고 생각하면 편하다 ) 

( 안드로이드 앱 만들때 많이쓰임 ) 

 

 

이런 익명의 객체가 안보이게 편하게 쓰라고 도와주는구나 생각하고 

저 위에, 문법 구조 (익명 객체 사용법) 를 익숙하게 해두는게 필요할 것 같다.