중첩 클래스: 클래스 멤버로 선언된 클래스
중첩 인터페이스: 클래스 멤버로 선언된 인터페이스
class Practice {
class FirstPractice {
} //중첩클래스
}
class Practice {
interface FirstPractice{
} //중첩 인터페이스
}
중첩클래스 코드를 작성할 때 인스턴스 멤버 클래스로 정적 필드와 정적 메소드는 선언할 수 없다
class A {
class B {
B(){} //생성자
String name; //인스턴스 필드
void method1(){} //인스턴스 메소드
static int number; //정적 필드
static void method2(); //정적 메소드
}
}
위의 코드에서 보면 중첩 클래스 내에서 생성자, 인스턴스 필드, 인스턴스 메소드는 사용 가능하지만 정적 필드(number)와 정적 메소드(method2)는 사용할 수 없다
그렇다면 중첩 클래스 B는 어떻게 사용할 수 있을까?
먼저 바깥쪽 A클래스가 먼저 객체로 만들어져야 한다
A a = new A();
A.B b = a.new B();
b.name ="name";
b.method1();
클래스 A의 객체를 먼저 생성하고 참조변수 a로 B객체를 생성해 B클래스 내의 필드와 메소드에 접근할 수 있다.
인스턴스 멤버가 아닌 정적 멤버 클래스를 살펴보자
class A {
static class B {
B(){} //생성자
String name; //인스턴스 필드
void method1(){} //인스턴스 메소드
static int number; //정적 필드
static void method2(); //정적 메소드
}
}
인스턴스 멤버 클래스와의 차이점은 정적 필드와 정적 메소드를 사용할 수 있다는 점이다
A.B b = new A.B();
b.name = "name";
b.method1();
A.B.number = 5;
A.B.method2():
정적 클래스의 경우에는 바깥 클래스 A의 객체를 먼저 생성하지 않아도 바로 중첩 클래스 B를 사용할 수 있다.
A.B.number = 5;
A.B.method2():
위의 코드에서 보는 것처럼 정적 필드와 메소드의 경우에는 클래스에서 바로 접근할 수 있다
메소드 안에 클래스가 오는 경우를 말한다
public class A {
void method () {
class D {
int field1;
D() {
System.out.println("D객체 생성");
}
void method1() {}
}
}
}
로컬 클래스에서 정적 필드와 메소드는 사용할 수 없다
로컬클래스는 선언된 메소드 안에서만 사용할 수 있다
void method () {
class D {
int field1;
D() {
System.out.println("D객체 생성");
}
void method1() {}
}
D d = new D();
d.field1 = 5;
d.method1();
}
D클래스에 선언된 필드와 메소드를 사용하고 싶다면 A클래스의 method로 접근해야 한다.
public class A {
int field1;
void method1() {}
static int field2;
static void method2() {}
//인스턴스 멤버 클래스
class B {
void method() {
field1 = 5;
method1();
field2 = 10;
method2();
}
}
}
인스턴스 멤버 클래스인 B 내부에서는 클래스 A의 인스턴스 필드와 인스턴스 메소드를 사용할 수 있다
클래스 A의 정적 필드와 정적 메소드도 사용할 수 있을까? 물론 사용할 수 있다
그렇다면 정적 클래스를 살펴보자
public class A {
int field1;
void method1() {}
static int field2;
static void method2() {}
//정적 멤버 클래스
static class C {
void method() {
field1 = 5; //호출못함
method1(); //호출못함
field2 = 10;
method2();
}
}
}
static 클래스 C에서는 인스턴스 필드와 메소드를 사용할 수 없다. 이유는?
인스턴스 필드와 메소드는 class A 객체가 생성되어야 사용할 수 있기 때문이다
즉, static class C내부에서는 A 객체가 없어도 사용할 수 있는 정적 필드와 메소드만 호출할 수 있다