내부 클래스
- 내부 클래스 : 클래스 내부에서 선언된 클래스
- 클래스 종류
1) 중첩 클래스, 인스턴스 클래스
2) 정적중첩 클래스, static 클래스
3) 지역 중첩 클래스, 지역클래스
4) 익명클래스
1) 중첩 클래스, 인스턴스 클래스
- 클래스 안에 필드 선언하는 위치에 선언되는 클래스
public class InnerExam1{
class Cal{
int value = 0;
public void plus(){
value++;
}
}
public static void main(String args[]){
InnerExam1 t = new InnerExam1(); // Inner Exam 1이 생성되어야 내부의 클래스또한 호출할 수 있다.
InnerExam1.Cal cal = t.new Cal();
cal.plus();
System.out.println(cal.value);
}
}
2) 정적중첩 클래스, static 클래스
- 필드 선언 시 static field 로 선언
public class InnerExam2{
static class Cal{
int value = 0;
public void plus(){
value++;
}
}
public static void main(String args[]){
//Inner Exam이 생성되지 않아도, 내부의 클래스를 호출할 수 있다.
InnerExam2.Cal cal = new InnerExam2.Cal();
cal.plus();
System.out.println(cal.value);
}
}
3) 지역 중첩 클래스, 지역클래스
- 메소드 내부에서 클래스 선언
- 메소드 안에서 클래스를 사용할 수 있음.
- 메소드 안에서 지역변수처럼 사용가능.
public class InnerExam3{
public void exec(){
class Cal{
int value = 0;
public void plus(){
value++;
}
}
Cal cal = new Cal();
cal.plus();
System.out.println(cal.value);
}
public static void main(String args[]){
InnerExam3 t = new InnerExam3();
t.exec();
}
}
4) 익명클래스
- 익명클래스, 내부 클래스
- 추상클래스를 만들면 추상 클래스 내부에 사용될 메소드를 자식클래스가 구현
- Action 상속받는 클래스를 굳이 만들 필요가 없는 경우 사용(한번만 클래스 내부에서 사용하고 다른 곳에서는 사용하지 않는 경우)
//추상클래스 Action
public abstract class Action{
public abstract void exec();
}
//추상클래스 Action을 상속받은 클래스 MyAction
public class MyAction extends Action{
public void exec(){
System.out.println("exec");
}// 부모클래스의 메소드 구현
}
//MyAction을 사용하는 클래스 ActionExam
public class ActionExam{
public static void main(String args[]){
Action action = new MyAction();
action.exec();
}
}
//MyAction을 사용하지 않고 Action을 상속받는 익명 클래스를 만들어서 사용하도록 수정해 보도록 하겠습니다.
public class ActionExam{
public static void main(String args[]){
Action action = new Action(){
public void exec(){
System.out.println("exec");
}
};
action.exec();
}
}
참고