내부 클래스

김설영·2022년 4월 2일
0

내부클래스 : 클래스 안의 클래스

class A {}
class B { // B 내부에 A의 객체를 생성 해주어야 A 클래스의 멤버에 접근이 가능하다. }

class A {	// B의 외부클래스
	class B { // 객체 생성 없이도, A의 멤버에 접근 가능 }	// A의 내부 클래스
}
  • 내부 클래스의 장점?
    1. 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.
    2. 코드의 복잡성을 줄일 수 있다. (캡슐화)
  • 내부 클래스의 종류와 유효 범위(scope)는 변수와 동일하다
class Outer {
	// 클래스 영역
	class InstanceOuter {}			// instance class
    static class StaticInner {}		// static class (객체 생성 없이 사용 가능)
    
    // 메서드 영역
    void myMethod() {
    	class LocalIneer {}			// local class
    }
    
    // 익명클래스(Anonymous class): 클래스의 선언과 객체 생성을 동시에 하는 이름 없는 클래스 (일회용)
}
  • 내부 클래스의 제어자는 변수에 사용 가능한 제어자와 동일하다.

    • 원래 클래스 앞에 사용 가능한 제어자는, default or public 밖에 안됨
    • 내부 클래스 앞에는 public, default, private, protected 전부 사용 가능
  • 내부 클래스에, static 변수(static int cv = 100;)를 사용하고자 할 때는 내부 클래스도 "static class" 여야 한다.

    • 상수 final static은 예외
  • 내부 클래스는, 외부 클래스의 private 멤버도 접근 가능하다.

  • 지역 내부 클래스는, 지역 내부 클래스를 감싸고 있는 메서드의 상수만 사용 가능하다. (변수 사용 불가.)


익명클래스

  • 이름이 없는 일회용 클래스. 정의와 생성을 동시에 한다.
// 자기 이름이 없으니, 조상 클래스 이름 또는 인터페이스 이름을 작성한다.

new 조상클래스이름() {
	// 멤버 선언 (클래스 내용)
}

또는

new 구현인터페이스이름() {
	// 멤버 선언 (클래스 내용)
}

// ex
import java.awt.*;  // java 의 윈도우 프로그래밍 도구
import java.awt.event.*;

class Ex7_17 {
    Object iv = new Object() { void method() {} };          // 익명 클래스
    static Object cv = new Object() { void method() {} };   // 익명 클래스

    void myMethod() {
        Object lv = new Object() { void method() {} };      // 익명 클래스
    }
}

public class Ch07_15_AnonymousClass {
    public static void main(String[] args) {
        Button b = new Button("Start");
        b.addActionListener(
                new ActionListener() {  // 클래스의 정의와 객체 생성을 동시에
                    public void actionPerformed(ActionEvent e) {
                        System.out.println("ActionEvent occurred!!");
                    }
                }
        );
    }
}
profile
블로그 이동하였습니당! -> https://kimsy8979.tistory.com/

0개의 댓글