Hello

Java 내부클래스의 제어자와 접근성

by 볼빵빵오춘기

내부 클래스의 제어자와 접근성

내부 클래스의 제어자는 변수에 사용 가능한 제어자와 동일

더보기

⇒ 원래 클래스 앞에는 (default)또는 public 만 쓸 수 있는데

⇒ public (default), private, protected 다 붙일 수 있다.

 

예제

예제1

더보기

⇒ static 변수를 사용할려면 static 클래스여야만한다.

⇒ static내부 클래스에서는 외부 클래스의 인스턴스 멤버에 접근할 수 없다.

⇒ 변수가 상수인경우네는 static을 가질 수 있다.

상수에는 클래스이름.상수이름 이렇게 접근도 가능하다.

 

public class InnerTest {
	class InstanceInner{
		int iv = 100;
//		staitc int cv = 100; // 에러! static 변수를 선언할 수 없다. 
		final static int CONST = 100; // final static은 상수이므로 허용 
	}

	static class StaticIneer{
		int iv = 200;
		static int cv = 200; // static클래스만 static 멤버를 정의할 수 있다. 
	}
	
	void myMethod() {
		class LocalInner{
			int iv = 300;
//			static int cv = 300; // 에러! static 변수를 선언할 수 없다.
			final static int CONST = 300;
		}
		
		int i = LocalInner.CONST; // => 여긴 가능  
		// why? 지역 내부 클래스의 static 상수는 메서드 내에서만 사용가능 
	}
	
	
	public static void main(String[] args) {
		System.out.println(InstanceInner.CONST);
		System.out.println(StaticIneer.cv);
//		System.out.println(LocalInner.CONST); // => 여긴 불가능 

	}

}

예제2

더보기
public class InnerTest {

	class InstanceInner{}
	static class StaticInner{}
	
	InstanceInner iv = new InstanceInner(); // 인스턴스멤버끼리는 직접 접근 가능 
	static StaticInner cv = new StaticInner(); // static 멤버끼리는 직접 접근 가능 
	
	static void staticMethod() { //static 멤버는 인스턴스멤버에 직접 접근 불가 
//		InstanceInner obj1 = new InstanceInner(); 
		StaticInner obj2 = new StaticInner();
		
		InnerTest outer = new InnerTest(); // 인스턴스클래스는 외부 클래스를 먼저 생성해야 생성가능 
		InstanceInner obj1 = outer.new InstanceInner();
	}
	
	void instanceMethod() { // 인스턴스메서드에서는 인스턴스멤버와 static멤버 모두 접근 가능 
		InstanceInner obj1 = new InstanceInner();
		StaticInner obj2 = new StaticInner();
		
//		LocalInner lv = new LocalInner(); // 지역 내부 클래스는 외부에서 접근할 수 없다.
	}
	
	void myMethod() {
		class LocalInner{}
		LocalInner lv = new LocalInner();
	}

}

⇒ 인스턴스멤버가 static멤버 쓰는건 가능

⇒ 반대로 static멤버가 인스턴스멤버로 쓰는건 불가능

예제3

더보기
public class Outer {
	private int outerIv = 0;
	static int outerCv = 0;
	
	class InstanceInner{
		int iiv = outerIv; // 외부 클래스의 private 멤버도 접근가능하다. 
		int iiv2 = outerCv;
	}
	
	static class StataicInner{
		// 스택틱 클래스는 외부 클래스의 인스턴스멤버에 접근할 수 없다. 
		// int siv = outerIv;
		static int scv = outerCv;
	}
	
	void myMethod() {
		int lv = 0;
		final int LV = 0; // JDK1.8 부터 final 생략 가능 
		
		class LocalInner{
			int liv = outerIv;
			int liv2 = outerCv;
			// 외부 클래스의 지역변수는 final 이 붙은 변수(상수)만 접근가능하다. 
			// int liv3 = lv;// 에러!!(JDK1.8는 에러아님) 
			int liv4 = LV;
		}
	}


}

예제4

예제5

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기