====== Ch.10 내부클래스 ====== ===== 내부클래스 ===== **내부(중첩)클래스의 구조** class 클래스명 { class 내부 클래스명 { ... } } **멤버 클래스의 파일명** 바깥클래스명$내부클래스명.class **로컬 클래스 파일명** 바깥클래스명$1내부클래스명.class :wr:**멤버클래스** public class Outer { // Outer 클래스의 내용 ... public static class Inner { // Inner 클래스의 내용 } } 다른 곳에서 Inner클래스 객체를 생성하기 위해 Inner클래스에 접근할 시 Outer.inner inn = new Outer.Inner(); :wr: **인스턴스 내부 클래스** public class Outer { // Outer 클래스의 내용 ... public class Inner { // Inner 클래스의 내용 } } 다른 곳에서 안쪽 클래스의 객체를 생성할 시 - 바깥 클래스의 객체를 먼저 생성하고, 그 객체변수를 이용해서 내부 클래스의 객체를 생성한다. Outer outer = new Outer(); Outer.Inner inn = outer.new Inner(); **로컬 클래스** package chapter10; public class LocalInnerEx { // 바깥클래스 int i=10; void outerMethod(){ class Inner { // 로컬 클래스 int x=20; // 메서드 지연변수 int i=30; // 메서드 지역변수 void innerMethod() { System.out.println(x); System.out.println(i); // 안쪽 클래스의 i변수 System.out.println(this.i); // 안쪽 클래스의 i변수 System.out.println(LocalInnerEx.this.i); // 바깥 클래스의 i변수 } } Inner inn = new Inner(); inn.innerMethod(); } public static void main(String[] args) { LocalInnerEx lic = new LocalInnerEx(); lic.outerMethod(); } } **A.java** package chapter10; class A { // 바깥 클래스 A() { // 바깥 클래스의 생성자 System.out.println("A 객체 생성"); } static class B { // static 내부 클래스 B() { // static 내부 클래스의 생성자 System.out.println("C 객체 생성"); } int var1; static int var2; void method1() { System.out.println("static 내부 클래스의 method1()"); } static void method2() { System.out.println("static 내부 클래스의 static method2()"); } } public class C { // 인스턴스 내부 클래스 C() { // 인스턴스 내부 클래스의 생성자 System.out.println("B 객체 생성"); } int var1; void method1() { System.out.println("인스턴스 내부 클래스의 method1()"); } } void method() { // 바깥 클래스의 메서드 class D { // 로컬 내부 클래스 D() { System.out.println("D 객체 생성"); } int var1; void method1() { System.out.println("로컬 내부 클래스의 method1()"); } } D d = new D(); d.var1 = 3; d.method1(); } } **Amain.java** package chapter10; public class Amain { public static void main(String[] args) { A a = new A(); //static 멤버 클래스 객체 생성 A.B b = new A.B(); b.var1 = 3; b.method1(); A.B.var2 = 3; A.B.method2(); //인스턴스 내부 클래스 객체 생성 A.C c = a.new C(); c.var1 = 3; c.method1(); //로컬 클래스 객체 생성을 위한 메소드 호출 a.method(); } } ===== 내부 인터페이스 ===== **내부 인터페이스 구조** class 클래스명 { interface 인터페이스명 { void method(); // 추상 메서드 } } package chapter10.interfacePkg; public class Outer { interface InterfaceEx { void method(); } InterfaceEx ie; void setInterfaceEx(InterfaceEx ie) { this.ie = ie; } void outerMethod() { ie.method(); } } package chapter10.interfacePkg; public class InterfaceExImple implements Outer.InterfaceEx{ @Override public void method() { System.out.println("InterfaceExImple method()"); } } package chapter10.interfacePkg; public class InterfaceExImple2 implements Outer.InterfaceEx{ @Override public void method() { System.out.println("InterfaceExImple2 method()"); } } package chapter10.interfacePkg; public class OuterMain { public static void main(String[] args) { Outer out = new Outer(); out.setInterfaceEx(new InterfaceExImple()); out.outerMethod(); out.setInterfaceEx(new InterfaceExImple2()); out.outerMethod(); } }