[29] 내부클래스
* Inner class
1. 내부클래스 특징
- 특정클래스안에 또 다른 클래스가 정의되는 것
- 내부클래스는 외부클래스의 모든 멤버들을 마치 자신의 멤버처럼 사용할 수 있다.
- static 내부클래스를 제외하고는 다른 내부클래스는 항상 외부클래스를 통해야 생성할 수 있다.
- 이벤트 처리에 많이 사용.
- GUI 어플리케이션(AWT, Swing)의 이벤트 처리에 주로 사용
- class안에 class가 있는 경우.
- 외부에서 접근할 필요가 없는 클래스,
즉 특정 클래스에 전적으로 사용되는 클래스는 내부 클래스로 선언.
- 내부 클래스를 사용하려면 먼저 외부 클래스를 생성해야 가능.
2. Member 내부클래스
- 객체를 생성해야만 사용할 수 있는 멤버들과 같은 위치에 정의되는 클래스
- 내부클래스를 생성하려면 외부클래스의 객체를 생성한 후 생성할 수 있다.
class Outer {
…
class Inner {
}
…
}
class Outer {
…
public void methodA( ) {
class Inner{
}
} //멤버메소드
…
}
3.static 내부클래스
- 내부클래스가 아니라 할 수 있으며, 외부클래스를 거치지 않고도 접근할 수 있다.
- 최상위 클래스
- 내부클래스안에 static변수를 가지고 있다면 해당 내부클래스는 static으로 선언해야 함.
- 외부클래스를 생성하지 않고도 외부클래스명.내부클래스생성자( ) 로 생성할수 있다.
class Outer {
…
static class Inner {
}
…
}
4. Anonymous 익명 내부클래스
- 이름이 없는 클래스
- 이름이 없기 때문에 생성자를 가질 수 없음.
- 한번만 사용하고 버려지는 객체를 사용할 때 유용한 내부클래스
- 이벤트구현시 많이 사용
① 내부클래스의 이름과 참조할 수 있는 참조 변수가 없는 유형
class Outer {
…
public void methodA ( ) {
new Inner( ) {
};
}
…
}
② 내부클래스의 이름은 존재하지 않지만 참조할 수 있는 참조변수의 이름이 있는 경우
class Outer {
…
Inner inn=new Inner ( ){
};
…
}
=================================================
package oop7inner;
class WebProgram{
String title = "ERP JAVA";
public void print()
{
//내부클래스 멤버접근에 하려면 반드시 객체생성를 하고
//해당 객체명을 통해 사용가능하다.
Language lang=new Language();//inner class객체생성
lang.display();
}//일반 멤버함수
public class Language{
String basic="JAVA,HTML,JavaScript";
public void display(){
System.out.println("기초 수업: " + basic);
}
}//내부클래스 inner class
public class Script{
String script = "JSP, Ajax, jQuery";
public void show(){
print();
//내부클래스에서 외부클래스 멤버함수는 접근가능
System.out.println("Web script: " + script);
}
}//Script 내부클래스
// 내부 클래스, static Inner Class
public static class Android{
public Android(){
System.out.println("Android SDK");
}
public static void view(){
System.out.println("Android CORE Programming");
}
}
}
public class InnerEx1 {
public static void main(String[] args) {
//Language lang=new Language();
//에러. 내부클래스는 독립적으로 객체생성 할 수 없다.
/*
WebProgram.Language lang=new WebProgram().new Language();
//외부클래스.내부클래스 형태로 단계별로 접근하면 된다.
lang.display();
*/
//WebProgram web=new WebProgram();
//web.print();
//WebProgram.Script ws=new WebProgram().new Script();
//ws.show();
//static 내부클래스 접근 방법
WebProgram.Android wa=new WebProgram.Android();
wa.view();
WebProgram.Android.view();
}
}
* 익명클래스
파일명 : AnoyEx.java
package oop7inner;
interface IMessage {
public abstract void msgPrint();
}
class Message implements IMessage{
@Override
public void msgPrint() {
System.out.println("Message클래스");
}
}
public class AnoyEx {
public static void main(String[] args) {
Message mess=new Message();
mess.msgPrint();
// anonymous익명클래스
//IMessage msg=new IMessage(); //에러
IMessage msg=new IMessage()
{
@Override
public void msgPrint() {
System.out.println("익명클래스");
}
};
msg.msgPrint();
}
}