Java - 내부클래스, 익명클래스

갓김치·2020년 9월 1일
0

자바 객체지향

목록 보기
13/13

참고

  • InnerTest.java
  • AnnoInner.java
  • AnnoInner2.java
  • DrawShape.java

내부클래스

  • InnerTest.java
public class InnerTest{
    public static void main(String[] args) {
    
         //Inner의 method2 호출
         //1. Outer 객체 생성
         Outer o = new Outer();
         
         //2. Inner 인스턴스화
         Outer.Inner in = o.new Inner();
         
         //3. Inner 인스턴스 in을 사용한 Inner의 인스턴스 메서드 호출
         in.method2(50);
    }
}

//내부클래스 예시: 안드로이드 앱 개발에 종종 쓰임
class Outer{
    int value = 10;
    class Inner{ //인스턴스 클래스
        int value = 20;
        
        void method2(int value){
            System.out.println(value); //인자값
            System.out.println(this.value); //20
            System.out.println(Outer.this.value); //10
        }
    }
    
    static class Inner2{ //static 클래스
    
    }
    
    void method(){
        class Inner3{ //지역클래스
        
        }
    }
}

익명클래스

DrawShape의 addWindowListener -> class를 익명내부클래스로 쓴거
인터페이스,추상클래스,일반클래스에서 전부 쓸 수 있음

//1. DrawShape.java - 일반클래스를 익명클래스로
addWindowListener(new WindowAdapter() {
   @Override
   public void windowClosing(WindowEvent e){
       System.exit(0);;
   }
});
//2. AnnoInner2.java - 인터페이스를 익명클래스로
Button bt1 = new Button();

bt1.addActionListener(new ActionListener() {
     
     @Override
     public void actionPerformed(ActionEvent e){
         //인터페이스의 추상메서드 구현
     }
});
/*
 * 1. bt1.addActionListener(); 메소드가 매개변수로 ActionListener를 받아들이는데,
 * 2. ActionListener는 인터페이스 이기때문에 그 자체로는 인스턴스 생성을 할 수 없다. (*인터페이스는 전부 추상메소드여서 생성자도 구현부가 없어 객체생성불가)
 * 3. 하지만 ActionListener 인터페이스를 구현하는 클래스는 객체를 생성할 수 있다.
 * 4. 그래서 class EventHandler를 만들어서 인터페이스 ActionListener를 구현한다.
 * 5. 인터페이스의 다형성을 이용해 EventHandler타입을 ActionListener에 담을 수 있다.
 * 6. 담은 그 매개변수를 bt1.addActionListener(매개변수); 에 넣어주면 된다.
 */
 
//3. AnnoInner.java - 인터페이스 구현체로 객체 생성
public class AnnoInner {
    public static void main(String[] args){
        Button bt1 = new Button();
        
        ActionListenr e1 = new EventHandler(); //인터페이스의 다형성
        bt1.addActionListener(e1);
        
        
    }
}

//bt1.addActionListener의 매개변수를 위해 actionListener구현체 생성
class EventHandler implements ActionListener{
    
    @Override
    public void actionPerformed(ActionEvent e){
        System.out.println("1번 버튼 눌림");
    }
}
profile
갈 길이 멀다

0개의 댓글