nme.kr

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();

	}

}