본문 바로가기
공부방/자바프로그래밍

자바 내부클래스

by 오후 네시 2020. 9. 7.

- 많이 쓰이진 않음. but 안드로이드에서는 많이 씀


1. 내부클래스(inner class)


1) 정의

 - 클래스 안에 선언된 클래스

 - GUI 어플리케이션(AWT, Swing)의 이벤트 처리에 주로 사용됨.


2) 형식

 - 자료형을 정의하는 자리 혹은 매개변수가 들어가는 자리에 들어감.


class Outer{

    private int a;


    class Inner{


    }

}


3) 장점

 - 내부 클래스에서 외부 클래스의 멤버변수들을 쉽게 접근할 수 있다.

   (반대는 안됨)

 - 코드의 복잡성을 줄일 수 있다.


4) 단점

 - 코드의 재사용이 어려움.



2. 무명 내부클래스


1) 이벤트 처리 등 1회성으로 사용하는 간단한 코드에 자주 사용


예)

e.addWindowListener( new WindowAdapter(){

   public void windowClosing(windowEvent e){

     System.exit(0);

   }

});


2) 

new 클래스이름(){}

혹은

new 인터페이스이름(){} 


- 원래 인터페이스는 new를 못함


3) 이름이 없으므로 재사용할 수 없다.


3. 예제


public class OuterClass{ //외부클래스

static int x=10;


class Inner(){ //내부클래스

  int getX(){

   //외부클래스의 멤버변수인 x를 자유롭게 사용함

    return x;

  }

} //end of class Inner


public static void main(String[] args){

  //변수 x는 static이므로 new없이 바로 사용가능. 

  //프로그램 시작과 동시에 이미 메모리에 올라가 있음.

  System.out.println(x);


//외부 클래스 인스턴스 생성

  OuterClass e = new OuterClass();


  //내부 클래스 인스턴스 생성

//(‘외부클래스.내부클래스’로 접근해야 함)

 OuterClass.Inner in = e.new Inner();


System.out.println(in.getX());

}

}//end of class OuterClass


1) 내부클래스를 쓰려면 위의 예제와 같이 외부클래스의 인스턴스를 생성 후 내부클래스의 인스턴스를 생성해야 한다. 

그러나

외부클래스의 참조변수 없이도 생성 가능한 방법이 있다. (이 방법을 많이 쓴다.)


OuterClass.Inner in = new OuterClass.Inner();


2) 메소드 안에 내부클래스가 있는 경우


public class InnerFinal{

    int x = 10;

    void print(){

        int y=20;


        class Inner{ //메소드 내부에 선언된 클래스

            void test(){


                //멤버변수인 x는 마음대로 사용가능

                System.out.println(x); 


               //지역변수인y도 JDK버전 1.8부터 에러 아님.

               //JDK 1.7버전까지는 y 앞에 final을 붙여야 함.

               System.out.println(y);

            } //end of test()

        }//end of Inner class

    }//end of print()

}//end of InnerFinal class


3) 인터페이스를 이용한 무명내부클래스 예제


//인터페이스 : 추상메소드 + 상수

public interface Flyer{

    public static final int MAX=100;

    public void takeoff();

    public void fly();

    public void land();

    //public static void methodA(){

    //}

    //public default void methodB(){

    //}

}


public class InnerUse{

public static void main(String[] args){

  //인터페이스는 new를 만들 수 없다.

  //그런데...

  Flyer f=new Flyer(){


      @Override

      public void takeoff(){

          System.out.println(“날아올라”);

      };


     @Override

     public void fly(){

         System.out.println(“날다”);

     };


     @Override

     public void land();

         System.out.println(“착륙”);

     };

   }//end of f

} //end of main


인터페이스에서 추상메소드 선언 시 중괄호{}를 쓰면 안된다.

중괄호를 쓴다면 안에 아무 것도 코딩되어 있지 않더라도 코딩한 것으로 간주하기 때문에 더 이상 추상메소드가 아니기 때문이다.

다만,

JDK버전이 올라감에 따라 JDK1.8부터는

메소드에 static이나 default를 쓰면 중괄호를 써도 된다.


Tip :


F3 -> 클래스 소스코드 보기

F4 -> 클래스 계층구조 보기



댓글