ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 중첩 선언과 익명 객체
    언어/JAVA 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. 익명객체 

     

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

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

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

     

    > 익명 자식 객체 

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

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

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

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

       

    > 익명 구현 객체

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

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

     

    '언어 > JAVA' 카테고리의 다른 글

    - JavaNextStep - 숫자야구게임(1) - 단위테스트  (0) 2023.07.10
    -JavaNextStep (1) - Junit  (0) 2023.07.10
    상속,동적생성  (0) 2023.07.06
    람다식  (0) 2023.07.05
    객체지향 - 캡슐화  (0) 2023.06.12
Designed by Tistory.