내부 클래스는 하나의 클래스로 안에 다른 클래스가 정의되어 있는 형태입니다.
class Outer {
int x = 10;
static int y = 20;
class Inner{ //내부 클래스
int z = 30;
public void print() {
System.out.println(x);
System.out.println(y);
System.out.println(z);
}
}
}
public class Ex {
public static void main(String[] args) {
//내부 클래스 선언방법
Outer out = new Outer();
Outer.Inner inner = out.new Inner();
inner.print();
}
}
main 안에 있는 인스턴스 생성방법을 보면 우리가 알고 있는 방법과는 약간의 차이가 있습니다.
내부 클래스의 인스턴스를 생성하기 위해서는 먼저 바깥 클래스의 인스턴스를 먼저 생성해야 합니다.
그 후 Outer 클래스의 인스턴스를 참조하여 Inner 클래스의 인스턴스를 생성할 수 있습니다.
정적 내부 클래스는 static과 관련된 멤버를 선언할 수 있는 내부 클래스입니다.
class Outer {
int x = 10;
static int y = 20;
static class Inner{ //내부 클래스
int z = 30;
public void print() {
// System.out.println(x); // outer클래스의 인스턴스 변수는 사용 불가능
System.out.println(y);
System.out.println(z);
}
}
}
public class Ex {
public static void main(String[] args) {
//정적 내부 클래스 선언방법
Outer.Inner inner = new Outer.Inner();
inner.print();
}
}
main 문을 보면 기본 내부 클래스의 선언 방법과는 조금 다른 것을 알 수 있습니다.
이전에 내부 클래스의 접근하기 위해서는 Outer클래스의 인스턴스를 생성하고, Outer 클래스의 인스턴스를 참조하여 내부 클래스의 인스턴스를 생성하여 접근했지만, static이 붙은 정적 내부 클래스는 Outer 클래스의 인스턴스 생성없이 곧바로 접근이 가능합니다.
지역 중첩 클래스는 특정한 메서드에 한정적인 용도로 사용한다.
-특징
👉 접근 제한자와 지정 예약어를 사용 할 수 없다.(메서드 내부에서만 사용되므로 접근을 제한할 필요가없다.)
👉 static 멤버를 선언하지 못한다.(인스턴스 필드와,메서드만 선언할 수 있다.)
👉 객체 생성은 외부에서는 불가능하고, 내부에서만 가능하다
public class Ex {
public static void main(String[] args) {
//정적 내부 클래스 선언방법
int x = 10;
class Inner{
int y = 20;
}
Inner in = new Inner();
System.out.println(x);
System.out.println(in.y);
익멸 클래스는 기존에 있는 클래스의 특정 메서드를 오버라이딩하여 사용자가 재정의 하여 사용한다.
-특징
👉 class 예약어와 클래스명이 없다.
👉 익명 클래스에 사용되는 중첩 클래스는 기존에 존재하는 클래스이다.
👉 생성자를 작성할 수 없다.
👉 외부 멤버 중 final 만 포함가능하다.
class Inner {
int y = 20;
public void print() {
System.out.println("Anonymous class");
}
}
public class Ex {
public static void main(String[] args) {
final int x = 10; //내부 클래스에서 사용하기 위해 final로 선언
Inner in = new Inner() {
public void print() {
System.out.println("overriding");
System.out.println(x);
System.out.println(y);
}
public void printX() {
//익명 클래스 안에서 메서드를 생성하여 사용 가능
System.out.println("Method 추가");
}
};
in.printX(); //익명클래스 안에서 생성된 메서드는 밖에서 사용 불가능
}
}