class A{ // B의 외부 클래스
...
class B{ // A의 내부 클래스
...
}
}
- 외부 클래스에서는 B클래스를 인식 못함
- B클래스에서는 A클래스 객체생성 없이도 사용 가능
class Outer{
class InstanceInner{...} // 클래스 내에서 사용 가능
static class StaticInner{...} // 객체 생성 없이 사용 가능
void myMethod(){
class LocalInner{...} // 메서드 안에서만 사용 가능
}
}
내부 클래스 | 특징 |
---|---|
인스턴스 내부 클래스 | 외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 인스턴스멤버처럼 다루어 진다. 주로 외부 클래스의 인스턴스 멤버들과 관련된 작업에 사용될 목적으로 선언됨 |
static 내부 클래스 | 외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 static멤버처럼 다루어 진다. 주로 외부 클래스의 static멤버, 특히 static메서드에서 사용될 목적으로 선언됨 |
지역 내부 클래스 | 외부 클래스의 메서드나 초기화블럭 안에 선언되며, 선언된 영역 내부에서만 사용될 수 있다. |
익명 내부 클래스 | 클래스의 선언과 객체의 생성을 동시에 하는 이름없는 클래스(1회용) |
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); 메소드 안에서만 사용가능한 클래스이기 때문에 호출 불가능
}
}
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);
}
}
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); // 외부 클래스 인스턴스 변수
}
}
}
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!!!");
}
});
}
}