언어/JAVA

중첩 선언과 익명 객체

now0204 2023. 7. 7. 13:53

1. 중첩클래스

 

- 객체 지향 프로그램에서 클래스간 긴밀한 관계 맺고 상호작용

- 클래스가 여러 클래스와 관계를 맺는 경우 독립 선언 

- 특정 클래스와 관계를 맺는 경우에는 중첩 클래스로 선언

    -> 유지보수에 도움, 코드 복잡성 줄이기, 클래스 멤버 쉽게 접근

 

- 크게 멤버클래스(인스턴스,static)와 로컬 클래스로 나눌 수 있다.

 

1.1 중첩클래스 저장

    -outter$inner.class 

    -A $1 inner.class로 저장됨

 

2. 멤버클래스 (인스턴스,static)

 

> 공통점:   접근제한자 public,default,private을 가질 수 있다.

                  외부클래스 멤버 쉽게 접근 가능, 외부클래스는 내부클래스 멤버에 접근하려면 내부 클래스를 생성해야함 

      

 

> 차이점 

   인스턴스 inner :  outter클래스의 인스턴스 멤버로 사용된다. 

                              인스턴스 멤버가 적용받는 규칙 동일 적용(인스턴스 필드,메서드,생성자에서만 자유롭게 생성)

                              외부 클래스의 모든 멤버와 메서드에 접근할 수 있다(단, 클래스 외부에서는 외부가 생성되야, inner생성가능)

                              일반적으로 private으로 생성

                              내부에 정적 멤버와 필드 가질 수 없다. 

                              (JDK 17이후 가능)

                              

 

    static inner :    outter클래스의 static 멤버로 사용된다.

                            static 멤버가 적용받는 규칙 동일 적용(외부 클래스 어디던 자유롭게 생성)

                            외부 클래스의 정적멤버와 메서드만 자유롭게 사용할 수 있다.

                           일반적으로 public으로 생성

                            내부에 정적필드와 메서드 만들 수 있다. 

 

 

3. 로컬 클래스 

  

   -특정 메서드 내부에서 선언되고 사용되는 클래스 

   -생성자나 메서드가 실행되는 동안에만 객체 생성가능

   - 로컬클래스에서 로컬변수(매개변수, 지역변수)를 사용할 경우 로컬변수는 final로 바뀜 이는 로컬 클래스 내부에서 

     지역변수의 값을 변경하지 못하도록 막기 위함이다. 

 

 

4. 중첩인터페이스 

  

   - 클래스의 멤버로 선언된 인터페이스, 혹은 인터페이스 내부에 인터페이스를 의미한다.

   - 클래스 내부에 인터페이스를 선언하는 이유는 해당 클래스와 긴밀한 관계를 맺는 구현 객체를 만들기 위함이다.

      (인터페이스가 해당 클래스에서 사용하는 것 외에 딱히 쓰임이 없을 때 정도)

  - 인터페이스 내부에 인터페이스를 선언하는 이유는 그냥 관련 인터페이스끼리 정리하는 용도이다. 

  - public이나 private을 붙일 수 있다.

  - 기본적으로 static임 내부 인터페이스는 따라서 객체 생성없이 항상 접근할 수 있다.

 

 

public class Button{


 public interface ClickListener{
   
   void onClick();
 }


  private ClickListener clicks;
  
  public void setClickListener(ClickListenr clicks){
    this.clicks = clicks;
   }
   
   public void click(){
    this.clicks.onClick();
   }

}
// 내부에 인터페이스 정의한 클래스

public class BuEx {

 public static void main(String[] args){
 
   Button bu = new Button();
   
   Button.ClickListen ck = Button.ClickListen{
   
      void Click(){ //구현}
   }
   
    Button.ClickListen cks = Button.ClickListen{
   
      void Click(){ //구현}
   }
   
   bu.setClickListen(ck);
   bu.setClickListen(cks);
   
   //위와같이 인터페이스 셋팅 가능 Button과 긴밀한 관계가 있을 뿐 인터페이스 사용법은 다를게 없음
 
 }
 
 
 }

                           

 

5. 익명객체 

 

  - 이름이 없는 객체를 말한다. 

  - 주로 필드값, 로컬 변수값, 매개변수 값으로 사용된다.

  -익명 객체는 클래스를 상속하거나 인터페이스를 구현해야만 생성할 수 있다. (익명 자식, 익명 구현)

 

> 익명 자식 객체 

   - 부모타입참조변수에 대입가능 

   - 중괄호 안에는 중괄호 안에서만 사용할 수 있는 익명 자식 객체의 멤버가 온다.

      (부모 참조변수로 어차피 자식만의 멤버와 메서드 접근 불가)

   - 상속이므로, 부모타입에 접근 가능 보통 익명자식객체는 부모 메서드를 재정의하는 코드가 온다.

   

> 익명 구현 객체

   - 인터페이스형 참조변수에 들어갈 수 있다.

   - 추상메서드 정의하는 코드가 온다.