프로그래밍 언어/JAVA

[JAVA] 중첩 클래스와 중첩 인터페이스 - 중첩클래스(2)

김곰댕 2021. 7. 20. 16:56
728x90

중첩 클래스의 접근 제한

바깥 필드와 메소드에서 사용 제한

 

예제)

package sec03.exam01_member_class.access;

public class A 
{
	class B { }
	static class C { }
	
	//인스턴스 필드
	B field1 = new B(); //B 객체를 생성하여 초기화
	C field2 = new C(); //C 객체를 생성하여 초기화
	
	//인스턴스 메소드
	void method1()
	{
		B var1 = new B(); //지역변수
		C var2 = new C(); //지역변수
	}
	
	//정적 필드와 정적 메소드는 정적 멤버클래스만 쓸 수 있다.
	
	//정적 필드
	//static B field3 = new B(); 클래스 B는 A 객체가 반드시 생성되어야함. 따라서 A객체 없이 B를 생성하려고 했으므로 오류
	static C field4 = new C(); //클래스 C가 static으로 선언되어 있기 때문에 A객체 없이도 C를 생성할 수 있음

	//정적 메소드
	static void method2()
	{
		//A객체 없이 실행될 수 있는 내용을 넣어야함
		//B var1 = new B();   B는 A객체가 반드시 필요하므로 오류
		C var2 = new C();
	}
}

 

멤버 클래스에서 사용 제한

 

예제)

package sec03.exam02_field_method_access;

public class A 
{
	int field1;
	void method1() { }
	
	static int field2;
	static void method2() { }
	
	class B
	{
		void method()
		{
			field1 = 10; //바깥쪽의 fiedl1을 바로 접근해서 사용 가능
			method1(); //바깥쪽 method1을 바로 접근해서 사용 가능
			
			field2 = 10;
			method2();
		}
	}
	
	static class C
	{
		void method()
		{
			//field1 = 10;  field1은 A객체가 반드시 있어야 사용이 가능, static class C는 A객체가 없이도 C객체가 생성이 가능하므로 오류
			//method1(); 
			field2 = 10; //A객체가 없이도 사용 가능한 static만 사용가능
			method2();
		}
	}
}

 

로컬 클래스에서 사용 제한

 

예제)

package sec03.exam03_localclass_access;

public class Outter 
{
	//자바 7이전
	//반드시 final을 붙여야함
	public void method1(final int arg)
	{
		final int localVariable = 1;
		class Inner
		{
			void method()
			{
				//final을 붙히게 되면
				//method()안에 지역변수로 arg, localVariable을 복사하여 사용
				//int arg = 10;
				//int localVariable = 1;
				//와 같은 효과
				int result = arg + localVariable;
			}
		}
	}
	
	//자바 8이후
	//final을 붙히지 않아도 final의 특성을 가짐
	//1) 로컬클래스에서 localVariable을 사용하는 경우
	public void method2(int arg)
	{
		int localVariable = 1;
		//localVariable = 10; final 특성을 가지고 있기 때문에 한번 값을 저장하면 다른 값으로 변경이 안됨
		class Inner
		{
			void method()
			{
				int result = arg + localVariable;
			}
		}
	}
	//2) 로컬클래스에서 localVariable을 사용하지 않는 경우
	public void method3(int arg)
	{
		int localVariable = 1;
		localVariable = 10; //값 변경이 가능, 로컬 클래스에서 localVariable을 사용하지 않았기 때문에 localVariable은 final의 특성을 가지지 않음
		class Inner
		{
			void method()
			{
				int result = arg + 10;
			}
		}
	}
}

 

중첩 클래스에서 바깥 클래스 참조 얻기

 

예제)

package sec03.exam04_outterclass_ref;

public class Outter 
{
	String field = "Outter-field";
	void method()
	{
		System.out.println("Outter-method");
	}
	
	class Nested
	{
		String field = "Nested-field";
		void method()
		{
			System.out.println("Nested-method");
		}
		
		void print()
		{
			System.out.println(this.field); //Nested의 field
			this.method(); //Nested의 method
			
			System.out.println(Outter.this.field); //Outter의 field
			Outter.this.method(); //Outter의 method
		}
	}
	

}
package sec03.exam04_outterclass_ref;

public class OutterExample 
{
	public static void main(String[] args)
	{
		Outter outter = new Outter();
		Outter.Nested nested = outter.new Nested();
		nested.print();	
	}
}

출력 결과

728x90