public class InnerEx1 {

	public static void main(String[] args) {
		Outer.StaticInner si = new Outer.StaticInner();
		System.out.println(si.iv);
		System.out.println(Outer.StaticInner.cv);
		System.out.println(Outer.StaticInner.MAX);
		
//		Outer.InstanceInner ii = new Outer.InstanceInner();
		Outer.InstanceInner ii = new Outer().new InstanceInner();
		
		Outer outer = new Outer();
		Outer.InstanceInner ii2 = outer.new InstanceInner();
		System.out.println(ii2.iv);
		System.out.println(ii2.MAX);
		System.out.println(Outer.InstanceInner.MAX);
		outer.method();
	}

}

class Outer {
	class InstanceInner {	// 인스턴스 내부클래스
		int iv = 100;				    //인스턴스 o
//		static int cv = 10;			    //스태틱 x
		final static int MAX = 200;		//변수 o
	}
	
	static class StaticInner {	// 스태틱 내부클래스
		int iv = 300;				    //인스턴스 o
		static int cv = 400;			//스태틱 o
		final static int MAX = 500;		//변수 o
	}
	
	void method() {	// 인스턴스 메서드
		class LocalInner {	    // 지역 내부클래스
			int iv = 600;			    //인스턴스 o
//			static int cv = 700;		//스태틱 x
			final static int MAX = 700;	//변수 o
		}
		
		LocalInner lc = new LocalInner();		// 지역 내부클래스가 만들어진 메서드 내에서만 사용 O
		System.out.println(lc.iv);
		System.out.println(lc.MAX);
		System.out.println(LocalInner.MAX);
	}
	
	void method2() {
//		LocalInner lc = new LocalInner();		// 지역 내부클래스는 정의되지 않은 다른 메서드에서 사용 X
	}
}

 

 

package ch07;

public class InnerEx2 {

	public static void main(String[] args) {
		Outer2 out = new Outer2();
		out.method(1);
		Outer2.InstanceInner i2 = out.new InstanceInner();
		System.out.println(i2.iiv);
		System.out.println(i2.iiv2);
		
		Outer2.StaticInner i3 = new Outer2.StaticInner();
		System.out.println(i3.siv);
		System.out.println(Outer2.StaticInner.scv);
	}

}

class Outer2 {
	private int outeriv = 10;		// 인스턴스 변수(외부)
	private static int outercv = 20; // 스태틱 변수(외부)
	class InstanceInner {			// 인스턴스 내부클래스 
		int iiv = outeriv;
		int iiv2 = outercv;
	}
	static class StaticInner {		// 스태틱 내부클래스
		int siv = new Outer2().outeriv;
		static int scv = outercv;
	}
	static StaticInner cv = new StaticInner();
	InstanceInner iv = new InstanceInner();
	static InstanceInner cv2 = new Outer2().new InstanceInner();
	static StaticInner iv2 = new StaticInner();
	
	
	void method(final int pv) {				//지역내부클래스에서 사용되는 메서드의 지역변수는 final여야함.
		int i = 0;
//		pv++;			//변경불가 (cuz, final)
		class LocalInner {			// 지역 내부클래스
			int liv = outeriv;				
			int liv2 = outercv;				
			void method() {					
//				i = 100;					//지역내부클래스에 속한 메서드 안에서 지역변수 변경 X(final로 여겨짐)
//				pv++;	//변경불가 (cuz, final)
				System.out.println("pv = " + pv);
				System.out.println(liv + ", " + liv2);
				System.out.println(outeriv + ", " + outercv);
			}
		}
		LocalInner li = new LocalInner();
		li.method();
	}
	
}

+ Recent posts