열심히 끝까지

28강 추상클래스/인터페이스/내부클래스 - 내부클래스 본문

멘토씨리즈 JAVA

28강 추상클래스/인터페이스/내부클래스 - 내부클래스

노유림 2022. 5. 2. 19:23

28-1 ) 내부클래스
            1. 내부클래스의 정의
                 내부클래스(Inner Class)란?
                     : 클래스 내부에서 생성된 클래스
         
                     < 구조 >
                 class OuterClass{
                         class InnerClass{
                                ...
                         }
                  }
                  
                  내부클래스(Inner Class)의 사용 목적
                      : 클래스간의 관계가 긴밀할 때 사용하여
                        코드를 간결하게 하기 위해 사용

            2. 내부클래스의 종류
                 * 내부 클래스는 선언된 위치에 따라
                  - 인스턴스 클래스
                  - 스태틱 클래스
                  - 지역 클래스
                  - 익명클래스
                   로 구분

                  1. 인스턴스 클래스(Instance 클래스)
                         - 외부 클래스에서 멤버변수 위치에 선언
                         - 클래스의 내무에서 인스턴스(객체)멤버처럼 다뤄지며,
                            인스턴스 멤버들과 상호작용 가능
                      <구조>
                       class outerClass{
                                class InnerClass{
                                        ....
                                 }
                        }
                  
                   2. 스태틱(static) 클래스
                          - 외부 클래스에서 멤버 변수 위치에 선언
                          - 클래스 내부에서 static 멤버처럼 다뤄지며 
                            static멤버들과 상호작용 가능
                      <구조>
                       class outerClass{
                                static class InnerClass{
                                        ....
                                 }
                        }

                   3. 지역 클래스
                          - 메서드 내부 지역변수 위치에 선언
                          - 메서드나 초기화 블록의 내부에서 다뤄지며
                             선언된 영역 내부에서 사용
                          - 메모리 영역 중 스택영역에 존재
                             메서드 호출 ~ 종료까지 메모리에 존재하는 영역
                      <구조>
                       class outerClass{
                                void A(){
                                           static class InnerClass{
                                            ....
                                            }
                                 }
                        }
            3. 내부클래스의 접근성
                     * 내부 클래스도 클래스이기 때문에 선언부에 접근제어자 사용 가능
                     <구조>
                    class outerClass{
                           private class InnerClass{
                                            ....   }
                           protected class InnerClass{
                                            ....   } 
                     } 

                    <실습> InnerClass1
                    static 클래스와 인스턴스 클래스 실습



                    <실습> Inner4


                     OuterClass의 구조
                      <필드>
                       - 인스턴스 변수 : a
                       - static 변수 : b
                      <내부 클래스>
                       - 인스턴스 클래스 : Inner
                       - static 클래스 : StaticInner

             * 내부 클래스의 객체를 생성하는 방법
             외부클래스.내부클래스명 객체명 = new 외부클래스생성자().내부클래스생성자();
                                                                             혹은
                                                       = 외부크래스객체.내부클래스생성자();



              1.  OuterClass 객체 생성 후 멤버에 접근
               - 인스턴스 멤버 접근 : 인스턴스명.변수명
               - static 멤버 접근 : 클래스명.변수명;

 

 


               2. 인스턴스 내부 클래스 접근
               - 외부클래스 객체 생성
                       OuterClass oc2 = new OuterClass();
               - 외부클래스 객체로 내부 클래스 객체 생성
                       OuterClass.Inner i = oc2.new Inner();
               - 내부클래스 객체로 메서드 호출
                       i.InnerMethod();

 

 


               3. 스태틱 내부 클래스 접근
                - 스태틱 클래스 객체 생성
                       OuterClass.StaticInner si = ..........
                - 스태틱 클래스로 스태틱 메서드 호출
                       si.staticMethod();
                          -> 스태틱 멤버는 객체를 생성하지 않고도 클래스명으로 호출 가능 
           

            4. 익명클래스 > 뒷부분에서 따로 다룰 것
                    " 익명 클래스 또는 무명 클래스라고도 하며, 이름이 없는 클래스를 의미 "
                 익명클래스(Anonymous)
                   : 이름이 없는 클래스
                  
                 <기존 클래스의 구조>
                 class Some{
                       private int a = 3;
                       int getter(){
                              return this.a;                
                       }
                       void setter(int a){
                              this.a = a;
                       }
                 }
                    ↓기존 클래스를 오버라이딩해서 만든다!
                 <익명클래스의 구조>
                  Some annoy = new Some(){
                        private int a = 3;
                        int getter(){
                            return this.a;
                        }
                        void setter(int a){
                            this.a=a'
                         }
                   }

           <실습>Anonymous2



           익명클래스는 일회성이므로, 객체를 다시 생성하고 호출하면
           OuterClass1에 정의된 메서드가 호출 -> method a

          <실습>Anonymous3
          익명클래스는 인터페이스 혹은 추상클래스를 일회성으로 구현할 때 많이 사용
          인터페이스와 추상클래스를 구현하는 익명클래스를 생성해보기