package ex0727;

public class Ex01 {
	public static void main(String[] args) {
		// 외부에서 중첩 클래스의 객체를 생성
		Test1.User1 u = new Test1.User1();
		u.write();
		
	}
}

class Test1 {
	int a = 10;
	static int b = 0;
	
	// static 중첩 클래스
	// 외부 클래스(Test1)의 객체 생성과 상관 없이 객체를 생성하여 사용할 수 있는 클래스
	// 컴파일하면 Test1$User1.class
	static class User1 {
		int x = 100;
		
		public void write() {
			// System.out.println(a); // 컴오류.
			System.out.println(b);
		}
		
		public void disp() {
			Test1 t = new Test1();
			System.out.println(t.a);
			t.print();
		}
	}
	
	public void print() {
		System.out.println(a + ", "+ b);
	}
	
	public static void sub() {
		// System.out.println(a); // 컴오류. 클래스 메소드는 인스턴스 변수 접근 불가
		System.out.println(b);
	}
}

package ex0727;

public class Ex02 {
	public static void main(String[] args) {
		// 내부 클래스는 외부에서 단독으로 객체 생성이 불가능
		// Test2.User2 ob = new Test2.User2(); // 컴오류
		
		// 내부 클래스는 외부 클래스의 객체를 생성후에 생성된 객체를 이용하여 생성
		// 내부 클래스는 외부 클래스 내(메소드)에서 사용할 목적으로 만듦(보안에 유리)
		Test2 ob = new Test2();
		Test2.User2 uu = ob.new User2();
		uu.write();
	}
}

class Test2 {
	int a = 10;
	static int b = 20;
	
	// 내부 클래스(member class)
	// 외부 클래스(Test2) 객체가 생성 되어야 객체를 생성할 수 있는 클래스
	class User2 {
		int x = 100;
		
		public void write() {
			// 외부 클래스의 인스턴스 변수나 인스턴스 메소드 접근 가능
			System.out.println(a+", " +b +", "+x);
		
			// print(); // 가능
		}
	}
	
	public void print() {
		System.out.println(a+", "+b);
	}
	
	public void sub() {
		// 메소드 내에서 내부 클래스의 객체 생성 및 활용 
		User2 u = new User2();
		u.write();
	}
	
}

+ Recent posts