InnerClass(내부클래스)를 사용하는 이유는 접근성에 있다고 볼수 있다. 접근제어자중에 private로 선언된 것은 외부에서 참조를 막아주어 은닉성을 높여주지만
다른 클래스에서 이 변수를 사용해야 하는 일이 생기면 내부 클래스를 생성하고 참조를 하면 가능하다.
내부클래스에 대한 이론적인 내용은
http://blog.naver.com/PostView.nhn?blogId=okibary_&logNo=20087656949&viewDate=¤tPage=1&listtype=0
여기에서 확인 바란다.(절대 귀찮아서가 아니라....)
그리고 그 아래는 예제이다.(익명클래스는 안넣었다.)
public class Outer {
static private int mStaticValue = 10;
private int mValue = 10;
private String mClassName = "Outer Class";
//static 클래스는 컴파일과 동시에 메모리를 잡아두기때문에 인스턴스를 생성하지 않아도 어디서든 사용이 가능하다.
static class Inner1 {
private int mVaue = 20;
static private int mStaticValue = 20;
private String mClassName = "Inner2 Class";
public void Play() {
System.out.println("//////////////////////////////");
System.out.println("static Inner Class");
System.out.println("//////////////////////////////");
System.out.println("------------------------------");
System.out.println(this.mVaue);
System.out.println(Inner1.mStaticValue);
System.out.println(this.mClassName);
System.out.println("------------------------------");
System.out.println(Outer.mStaticValue);
// System.out.println(Outer.this.mValue);
// Error-static InnerClass에서 Outer 변수를 사용하고 싶으면 Static으로 지정해줘야함.
// System.out.println(Outer.this.mClassName);
System.out.println("------------------------------");
}
}
class Inner2 {
private int mValue = 30;
// static private int mStaticValue = 20;//Static InnerClass에서만 static변수
// 선언 가능
static final private int mStaticValue = 30;// 상수는 허용.(final)
private String mClassName = "Inner1 Class";
public void Play() {
int mValue = 40;
String mClassName = "Methode";
System.out.println("//////////////////////////////");
System.out.println("InnerClass");
System.out.println("//////////////////////////////");
System.out.println("------------------------------");
System.out.println(mClassName);
System.out.println(mValue);
System.out.println("------------------------------");
System.out.println(this.mClassName);
System.out.println(this.mValue);
System.out.println(this.mStaticValue);
System.out.println("------------------------------");
System.out.println(Outer.this.mClassName);
System.out.println(Outer.this.mValue);
System.out.println(Outer.mStaticValue);// static변수는 ClassName으로 접근
System.out.println("------------------------------");
}
// static class Inner1{//static Class는 최상위에 선언되어야함
//
// }
}
void Play() {
int mPlayValue1 = 50;
final int mFinalPlayValue = 50;
final String mMethodName = "Play in Outer";
class Inner3 {
private int mValue = 60;
// static private int mStaticValue = 70;//staticClass가 아니므로 Error
static final private int mStaticValue = 60;
private String mClassName = "Inner3 Class";
public void Play() {
System.out.println("//////////////////////////////");
System.out.println("LocalInnerClass");
System.out.println("//////////////////////////////");
System.out.println("------------------------------");
System.out.println(this.mClassName);
System.out.println(this.mValue);
System.out.println(Inner3.mStaticValue);
System.out.println("------------------------------");
// System.out.println(mPlayValue1);//지역변수를 사용할때에 final이 없으면
// 사용불가능
System.out.println(mMethodName);
System.out.println(mFinalPlayValue);
System.out.println("------------------------------");
System.out.println(Outer.this.mClassName);
System.out.println(Outer.this.mValue);
System.out.println(Outer.mStaticValue);
System.out.println("------------------------------");
// Ststem.out.
}
}
Inner3 inner3 = new Inner3();// 메소드 내부에서 인스턴스 생성
inner3.Play();
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Outer outer = new Outer();
Inner1 inner1 = new Inner1();
inner1.Play();
// Inner2 inner2 = new Inner2();//Error - InnerClass의 인스턴스를 생성하 위해서는
// OuterClass의 객체가 필요하다.
Inner2 inner2 = outer.new Inner2();
inner2.Play();
outer.Play();// LocalCalss 호출
}
}