[Java] Inner Class

Jane·2021년 1월 31일
1
post-thumbnail

내부 클래스

  • 클래스 내에 선언된 클래스
  • 클래스처럼 abstract, final과 같은 제어자를 사용하거나, 멤버변수처럼 private, protected 등의 접근 제어자를 사용할 수 있다.
  • 내부 클래스와 외부 클래스에 선언된 변수의 이름이 같다면 변수 앞에 this 또는 외부 클래스명.this를 붙여 구별할 수 있다.
class Main {
    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner();
        inner.method();
    }
}

class Outer {
    int value = 10;

    class Inner {
        int value = 20;

        void method() {
            int value = 30;
            System.out.println("value 1: " + value);
            System.out.println("value 2: " + this.value);
            System.out.println("value 3: " + Outer.this.value);
        }
    }
}
  • 실행 결과

내부 클래스의 장점

  • 내부 클래스에서 외부 클래스의 멤버들에 쉽게 접근할 수 있다.
  • 캡슐화로 코드의 복잡성을 줄일 수 있다.

내부 클래스의 종류

instance class

  • 외부 클래스의 멤버변수 위치에 선언
  • 외부 클래스의 인스턴스멤버와 같이 취급
  • 주로 외부 클래스의 인스턴스멤버들과 관련된 작업을 위해 선언

static class

  • 외부 클래스의 멤버면수 위치에 선언
  • 외부 클래스의 static 멤버와 같이 취급
  • 주로 외부 클래스의 static 멤버(특히 static 메서드)에서 사용될 목적으로 선언
  • 내부 클래스 중 유일하게 static 멤버를 가질 수 있다.
    (단 final static int CONST와 같이 상수는 모든 내부 클래스에서 정의할 수 있다.)
  • 외부 클래스의 인스턴스멤버를 객체 생성 없이 사용할 수 없다.
static void staticMethod() {
    // static 메서드에서 인스턴스 멤버에 접근하기 위해서는
    // 외부 클래스 객체를 먼저 생성해야
    OuterClass outer = new OuterClass();
    // 인스턴스 클래스를 생성할 수 있다. 
    InstanceInnerClass ii = outer.new InstanceInnerClass(); 
}

local class

  • 외부 클래스의 메서드나 초기화블럭 안에 선언
  • 선언된 영역 내부에서만 사용될 수 있다.

anonymous class

  • 클래스의 선언과 객체의 생성을 동시에 하는 이름없는 클래스 (일회용)
  • 이름이 없기 때문에 생성자를 가질 수 없다.
  • 조상클래스(또는 구현하고자 하는 인터페이스)의 이름을 사용하여 정의하기 때문에 하나의 클래스(또는 인터페이스)만 상속(또는 구현)받을 수 있다.
import java.awt.*;
import java.awt.event.*;

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

class EventHandler implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        System.out.println("ActionEvent occurred!");
    }
}

EventHandler 클래스를 아래와 같은 익명클래스로 정의할 수 있다.

import java.awt.*;
import java.awt.event.*;

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


Source

  • 자바의 정석 (남궁성 저)

0개의 댓글