댄스댄스 2012. 5. 3. 15:17

 

* Inner class

 

1. 내부클래스 특징
  - 특정클래스안에 또 다른 클래스가 정의되는 것
  - 내부클래스는 외부클래스의 모든 멤버들을 마치 자신의 멤버처럼 사용할 수 있다.
  - static 내부클래스를 제외하고는 다른 내부클래스는 항상 외부클래스를 통해야 생성할 수 있다.
  - 이벤트 처리에 많이 사용.
  - GUI 어플리케이션(AWT, Swing)의 이벤트 처리에 주로 사용

  - class안에 class가 있는 경우.
  - 외부에서 접근할 필요가 없는 클래스,
     즉 특정 클래스에  전적으로 사용되는 클래스는 내부 클래스로 선언.
  - 내부 클래스를 사용하려면 먼저 외부 클래스를 생성해야 가능.


2. Member 내부클래스
  - 객체를 생성해야만 사용할 수 있는 멤버들과 같은 위치에 정의되는 클래스
  - 내부클래스를 생성하려면 외부클래스의 객체를 생성한 후 생성할 수 있다.

    

    class Outer {
            …
              class Inner {
              }
            …
    }

 

    class Outer {
           …
           public void methodA( ) {
                  class Inner{
                  }
           } //멤버메소드
           …
     }

 

3.static 내부클래스
  - 내부클래스가 아니라 할 수 있으며, 외부클래스를 거치지 않고도 접근할 수 있다.
  - 최상위 클래스
  - 내부클래스안에 static변수를 가지고 있다면 해당 내부클래스는 static으로 선언해야 함.
  - 외부클래스를 생성하지 않고도 외부클래스명.내부클래스생성자( ) 로 생성할수 있다.

        class Outer {
             …
             static class Inner {
             }
             …
         }


4. Anonymous 익명 내부클래스
  - 이름이 없는 클래스
  - 이름이 없기 때문에 생성자를 가질 수 없음.
  - 한번만 사용하고 버려지는 객체를 사용할 때 유용한 내부클래스
  - 이벤트구현시 많이 사용

 

  ① 내부클래스의 이름과 참조할 수 있는 참조 변수가 없는 유형

      class Outer {
            …
            public void methodA ( ) {
                    new Inner( ) {
                    };
            }
            …
       }

 

② 내부클래스의 이름은 존재하지 않지만 참조할 수 있는 참조변수의 이름이 있는 경우

       class Outer {
           …
            Inner inn=new Inner ( ){
            };
           …
       }

 

=================================================

 

package oop7inner;

class WebProgram{
    String title = "ERP JAVA";
    public void print()
    {
        //내부클래스 멤버접근에 하려면 반드시 객체생성를 하고
        //해당 객체명을 통해 사용가능하다.
        Language lang=new Language();//inner class객체생성
        lang.display();
       
    }//일반 멤버함수
   
    public class Language{
        String basic="JAVA,HTML,JavaScript";
       
        public void display(){
            System.out.println("기초 수업: " + basic);
        }
    }//내부클래스 inner class

    public class Script{
        String script = "JSP, Ajax, jQuery";       
        public void show(){
            print();
            //내부클래스에서 외부클래스 멤버함수는 접근가능
            System.out.println("Web script: " + script);
        }
    }//Script 내부클래스
   
    // 내부 클래스, static Inner Class
    public static class Android{
        public Android(){
            System.out.println("Android SDK");
        }       
        public static void view(){
            System.out.println("Android CORE Programming");
        }
    }
}

public class InnerEx1 {
    public static void main(String[] args) {
        //Language lang=new Language();
        //에러. 내부클래스는 독립적으로 객체생성 할 수 없다.
/*       
        WebProgram.Language lang=new WebProgram().new Language();
        //외부클래스.내부클래스 형태로 단계별로 접근하면 된다.
        lang.display();
*/       
        //WebProgram web=new WebProgram();
        //web.print();
       
        //WebProgram.Script ws=new WebProgram().new Script();
        //ws.show();
       
        //static 내부클래스 접근 방법
        WebProgram.Android wa=new WebProgram.Android();
        wa.view();

        WebProgram.Android.view();
               
    }
}

 

 

* 익명클래스

 

파일명 : AnoyEx.java

 

package oop7inner;

interface IMessage {
    public abstract void msgPrint();
}

class Message implements IMessage{
    @Override
    public void msgPrint() {
        System.out.println("Message클래스");       
    }
}

public class AnoyEx {
    public static void main(String[] args) {
        Message mess=new Message();
        mess.msgPrint();
       
        // anonymous익명클래스
        //IMessage msg=new IMessage(); //에러
       
        IMessage msg=new IMessage()
                     {
                        @Override
                        public void msgPrint() {
                            System.out.println("익명클래스");                           
                        }           
                      };
       
         msg.msgPrint();

    }

}