본문 바로가기
study/Java

[Java] 27. 내부클래스2 (지역내부클래스에 사용되는 메서드에서 메서드의 지역 변수 접근시 접근되는 지역 변수는 상수화 되어야 함)

by 금이패런츠 2022. 3. 23.
728x90
반응형
package chap10;
class Outer2 {
	private int outeriv = 10;
	private static int outercv = 20;
	class IntanceInner { //내부클래스에서 외부클래스의 private 멤버 접근가능
		int iiv = outeriv;
		int iiv2 = outercv;
	}
	static class StaticInner { //내부클래스에서 외부클래스의 private 멤버 접근가능
//		int siv = outeriv; //클래스멤버에서 인스턴스멤버에 직접 접근 오류
		int siv = new Outer2().outeriv;
		static int scv = outercv;
	}
	void method(int pv) {
		//pv : 매개변수. 지역변수
		int n = 0;
//		n++;
		class LocalClass {
			int liv = outeriv; //외부클래스의 private 멤버에 접근 가능
			int lcv = outercv;
			void method(int num) {
				num++;
				System.out.println("num=" + num);
				//지역내부클래스에 사용되는 메서드에서 메서드의 지역 변수 접근시 접근되는 지역 변수는 상수화 되어야 한다.
				//지역변수의 변경이 없다면 상수로 본다.
				//지역변수의 변경이 있다면 오류발생.
				System.out.println("pv=" + pv); //상수화된 변수는 접근 허용
				System.out.println("liv=" + liv);
				System.out.println("lcv=" + lcv);
				System.out.println("Outeriv=" + outeriv);
				System.out.println("Outercv=" + outercv);
				System.out.println("n=" + n);
			}
		}
		LocalClass lc = new LocalClass();
//		pv++;
		lc.method(pv);
	}
}
public class InnerEx2 {
	public static void main(String[] args) {
		//IntanceInner, StaticInner 객체의 멤버들을 출력하기
		//외부클래스의 method() 호출하기
		Outer2 out = new Outer2();
		Outer2.IntanceInner ii = out.new IntanceInner();
		System.out.println("IntanceInner.iiv=" + ii.iiv);
		System.out.println("IntanceInner.iiv2=" + ii.iiv2);
		
		Outer2.StaticInner si = new Outer2.StaticInner();
		System.out.println("StaticInner.siv=" + si.siv);
		System.out.println("StaticInner.scv=" + si.scv);
		
		out.method(50);
	}
}
728x90
반응형