JAVA/상속

Test129 중첩 클래스(내부 클래스) - 지역 클래스(로컬 클래스, local class)

ready J 2020. 9. 11. 13:45

   3. 지역 클래스(로컬 클래스, local class)
      메소드 내부에... 『public class 클래스명』 or 『public static class 클래스명』

  - 클래스의 메소드 안에서 클래스를 정의하는 것으로 내부 멤버 클래스와 유사한 성격을 가지고 있긴 하지만 접근제어지시자는 붙일 수 없다.


지역 클래스(로컬 클래스, local class)의 예시

/*===========================
  ■■■ 클래스 고급 ■■■
  - 중첩 클래스(내부 클래스)
=============================*/

// outer
class InnerOuterTest
{
	static int a = 10;
	int b = 20;

	class InnerNested
	{
		int c = 30;

		void write()
		{
			System.out.println("inner 의 write()...");
			System.out.println("a : " + a);
			System.out.println("b : " + b);
			System.out.println("c : " + c);
		}
	}

	void write()
	{
		System.out.println("outer 의 write()...");
		InnerNested ob1 = new InnerNested();
		ob1.write();	//-- inner 의 write() 메소드 호출
	}
}

public class Test129
{
	public static void main(String[] args)
	{
		InnerOuterTest ob2 = new InnerOuterTest();
		ob2.write();	//-- outer 의 write() 메소드 호출
		//--==>> outer 의 write()...
		//		 inner 의 write()...
		//		 a : 10
		//		 b : 20
		//		 c : 30

		//InnerNested ob3 = new InnerNested();
		//--==>> 에러 발생

		//InnerOuterTest.InnerNested ob4 = new InnerOuterTest.InnerNested();
		//--==>> 에러 발생

		// ※ 중첩 내부 클래스(static 중첩 클래스)와는 달리
		//    외부 클래스의 인스턴스(객체)를 사용하지 않고
		//    단독으로 내부 클래스의 인스턴스를 생성하는 것은 불가능하다.

		// ※ Test127.java 파일과 비교할 것~!!!

		InnerOuterTest.InnerNested ob5 = ob2.new InnerNested();
		ob5.write();
		//--==>> inner 의 write()...
		//		 a : 10
		//		 b : 20
		//		 c : 30

		InnerOuterTest.InnerNested ob6 = new InnerOuterTest().new InnerNested();
		ob6.write();
		//--==>> inner 의 write()...
		//		 a : 10
		//		 b : 20
		//		 c : 30


	}
}