내부 클래스

배지원·2022년 9월 28일
1

JAVA

목록 보기
19/32

1. 내부클래스

  • 클래스 안의 클래스
  • 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.
  • 코드의 복잡성을 줄일 수 있다.(캡술화)
class A{		// B의 외부 클래스
	...
    class B{		// A의 내부 클래스 
    	...
    }
}  

- 외부 클래스에서는 B클래스를 인식 못함
- B클래스에서는 A클래스 객체생성 없이도 사용 가능

(1) 종류와 유효범위

  • 변수와 같이 인스턴스, 클래스, 지역 클래스로 구분된다.
class Outer{
	class InstanceInner{...}	// 클래스 내에서 사용 가능
    static class StaticInner{...}	// 객체 생성 없이 사용 가능
    void myMethod(){
 		class LocalInner{...}   // 메서드 안에서만 사용 가능
    }
}    
내부 클래스특징
인스턴스 내부 클래스외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 인스턴스멤버처럼 다루어 진다. 주로 외부 클래스의 인스턴스 멤버들과 관련된 작업에 사용될 목적으로 선언됨
static 내부 클래스외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 static멤버처럼 다루어 진다. 주로 외부 클래스의 static멤버, 특히 static메서드에서 사용될 목적으로 선언됨
지역 내부 클래스외부 클래스의 메서드나 초기화블럭 안에 선언되며,
선언된 영역 내부에서만 사용될 수 있다.
익명 내부 클래스클래스의 선언과 객체의 생성을 동시에 하는 이름없는 클래스(1회용)

(2) 내부 클래스의 제어자와 접근성

  • 내부 클래스의 제어자는 변수에 사용 가능한 제어자와 동일
  • 일반 class의 접근자에는 (default)와 public만 가능한데 내부 클래스에는 static, protected 모두 가능함
class test{
    int a;
    class Inner{                // 인스턴스 내부 클래스
        int iv = 100;
        int ex = a;             // 외부 클래스 인스턴스 변수 사용 가능
    //  static int cv =100;   에러 발생, static 변수를 사용 할수 없음
        final static int CONST = 100;       // final static은 상수이므로 허용
    }

    static class StaticInner{       // static 내부 클래스
        int iv = 200;
    //  int ex = a;             외부 클래스 인스턴스 변수 사용 불가능
        static int cv = 200;
    }

    void myMethod(){
        class LocalInner{           // 지역 내부 클래스
            int iv = 300;
            int ex = a;             // 외부 클래스 인스턴스 변수 사용 가능
            final static int CONST = 100;
        }
    }
}

public class InnerTest {
    public static void main(String[] args) {
        System.out.println(test.Inner.CONST);
        System.out.println(test.StaticInner.cv);
     // System.out.println(test.LocalInner.CONST);        메소드 안에서만 사용가능한 클래스이기 때문에 호출 불가능
    }
}

(3) 메인 메서드에서 내부 클래스 사용법

  • 일반적으로 내부 클래스는 외부 클래스 내에서만 사용할려고 만드는 것이라
    굳이 사용하자면 아래처럼 구현 가능
class Outer{
    class InstanceInner{
        int iv = 100;
    }

    static class staticInner{
        int iv = 100;
        static int cv = 200;
    }

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

public class main {
    public static void main(String[] args) {
        Outer o = new Outer();
        Outer.InstanceInner li = o.new InstanceInner();     // 인스턴스 생성 가능(인스턴스는 객체 생성후 사용 가능)

        System.out.println("li.iv : "+li.iv);
        System.out.println("Outer2.staticInner.cv :"+Outer.staticInner.cv);

        Outer.staticInner si = new Outer.staticInner();     // static은 객체 생성 없이 사용 가능
        System.out.println("si.iv :"+si.iv);
    }
}

(4) 같은 이름의 변수 사용시 구별법

class Outer{
    int value = 10;

    class Inner{
        int value = 20;

        void method(){
            int value =30;
            System.out.println("           value :" +value);               // 지역 변수
            System.out.println("      this.value :" +this.value);          // 내부 클래스 인스턴스 변수
            System.out.println("Outer.this.value :" +Outer.this.value);    // 외부 클래스 인스턴스 변수
        }
    }
}

2. 익명클래스

  • 이름이 없는 일회용 클래스. 정의와 생성을 동시에
  • 이름이 없기 때문에 조상 클래스 이름을 사용하거나 인터페이스 이름을 사용함
new 조상 클래스 이름(){
		// 멤버 선언
}

or

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

실습

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

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

public class Anonymous {
    public static void main(String[] args) {
        Button b = new Button("start");
        b.addActionListener(new EventHandler());
    }
}

-------------- 익명 클래스 사용 ------------
public class Anonymous {
    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
Web Developer

0개의 댓글