본문 바로가기

Java

Java InnerClass(내부클래스)

InnerClass(내부클래스)를 사용하는 이유는 접근성에 있다고 볼수 있다. 접근제어자중에 private로 선언된 것은 외부에서 참조를 막아주어 은닉성을 높여주지만

다른 클래스에서 이 변수를 사용해야 하는 일이 생기면 내부 클래스를 생성하고 참조를 하면 가능하다. 


내부클래스에 대한 이론적인 내용은 

http://blog.naver.com/PostView.nhn?blogId=okibary_&logNo=20087656949&viewDate=&currentPage=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 호출


}

}

'Java' 카테고리의 다른 글

다형성  (0) 2012.04.03
추상클래스(abstract), 인터페이스(interface)  (0) 2012.03.29
final  (23) 2012.03.27
랩퍼클래스  (0) 2012.03.26
카멜표기법  (0) 2012.03.26