내부 클래스
: 클래스 안에 선언된 클래스
- 어느 위치에 선언하느냐에 따라서 4가지 형태가 있다.
내부 클래스 1 "중첩클래스" , "인스턴스클래스"
: 클래스 안에 인스턴스 변수, 즉 필드를 선언하는 위치에 선언되는 경우. 보통 중첩클래스 혹은 인스턴스 클래스라고 한다.
public class InnerExam1{
class Cal { //InnerExam 안에 내부클래스 Cal 생성
int value = 0; //1
public void plus (){ //2
value++;
}
}
public static void main (String args[]){ //실행
InnerExam1 t = new InnerExam1(); //1. InnerExam1의 객체 생성
InnerExam1.Cal cal = t.new Cal(); //2. Cal의 객체 생성한 뒤 사용
cal.plus();
System.out.println(cal.value);
}
}
내부 클래스 2
: 내부 클래스가 static으로 정의된 경우, 정적 중첩 클래스 또는 스태틱 클래스 (static class)라고 한다.
: 필드 선언 시 스태틱한 필드로 선언한 것과 같다. 이 경우에은 InnerExam2 객체를 생성할 필요 없이 new InnerExam2.Cal()로 객체를 생성할 수 있다.
public class InnerExam2{
static class Cal {
int value = 0;
public void plus (){
value++;
}
}
public static void main (String args[]){
InnerExam2.Cal cal = new InnerExam2.Cal();
cal.plus();
System.out.println(cal.value);
}
}
중첩클래스 3
: 메소드 안에 클래스를 선언한 경우, 지역 중첩 클래스 또는 지역 클래스(Local class)라고 한다.
: 메소드 안에서 해당 클래스를 이용할 수 있다.
public class InnerExam3 {
public void exec (){
class Cal{ //exec라는 메소드 내부에 Cal class 생성
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 = new Action(){
public void exec(){
System.out.println("exec");
}
- 괄호 안에는 메소드를 구현하거나 메소드를 추가할 수 있다. 이렇게 생성된 이름 없는 객체를 action이라는 참조변수가 참조하도록 하고, exec()메소드를 호출.
action.exec();
- 익명클래스를 만드는 이유는 Action을 상속 받는 클래스를 만들 필요가 없을 경우
- Action을 상속받는 클래스(즉, MyAction)가 해당 클래스에서만 사용되고 다른 클래스에서는 사용되지 않는 경우이다.
//추상클래스 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();
}
}
'👩💻 BackEnd > ☕️ 자바 [Java]' 카테고리의 다른 글
[JAVA] 자바 IO (0) | 2023.04.24 |
---|---|
[JAVA] 사용자 정의 Exception (0) | 2023.04.18 |
[JAVA] 인터페이스 default / static 예시 (0) | 2023.04.17 |
[Java] 클래스 형변환 (0) | 2023.04.17 |
[Java] 부모 생성자 super / 오버라이딩 (0) | 2023.04.17 |