내부 클래스inner class

코코·2020년 7월 28일
0

Java

목록 보기
8/25
post-thumbnail

📚 자바의 정석을 정리한 내용입니다.

내부클래스의 종류

내부 클래스는 단순히 클래스 내에 선언된 클래스다.

  • 내부 클래스의 장점
    1.내부 클래스에서 외브 클래스 멤버에 쉽게 접근 가능
    2.코드 복잡성을 줄인다(캡슐화)


위 다이어그램에서 보다시피 내부 클래스는 클래스의 멤버처럼 다룬다. 다른 점은 익명 클래스Anonymous class가 있다.

내부클래스의 제어자, 접근성

자바의 정석 예제에 간단히 주석을 달았습니다.

class Outer {
    class InstanceInner {
        int iv = 100;
    }

    static class StaticInner {
        int iv = 200;
        static int cv = 300;
    }

    void myMethod() {
        class LocalInner {
            int iv = 400;
        }
    }
}

public class InnerEx4 {
    public static void main(String[] args) {
        /*
        * 인스턴스내부클래스의 인스턴스를 생성하려면
        * 외부클래스의 인스턴스가 먼저 필요하다.
        * */
        Outer outer = new Outer();
        Outer.InstanceInner instanceInner = outer.new InstanceInner();

        System.out.println("instanceInner.iv : " + instanceInner.iv);
        System.out.println("Outer.StaticInner.cv : " + Outer.StaticInner.cv);

        /*static 내부 클래스의 인스턴스는 외부 클래스를 먼저 생성하지 않아도 된다.*/
        Outer.StaticInner staticInner = new Outer.StaticInner();
        System.out.println("staticInner.iv : " + staticInner.iv);
        System.out.println("staticInner.iv : " + staticInner);
    }
}

익명클래스anonymous class

익명클래스는 이름 없는 내부 클래스다. 이름이 없으므로 객체를 생성할 수 없고, 재사용할 수도 없다.

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Anonymous {
    public static void main(String[] args) {
        Button button = new Button("Start");
    }
}

class EventHandler implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("ActionEvent Occured!");
    }
}

이런 코드를

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Anonymous {
    public static void main(String[] args) {
        Button button = new Button("Start");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("ActionEvent occurred!!!");
            }
        });
    }
}

익명클래스를 이용해서 이렇게 변경할 수 있다.

0개의 댓글