nested class
: 내부에 선언된 클래스, 관계 클래스
클래스가 여러 클래스와 관계를 맺을 경우: 독립적으로 선언하는 것이 좋다.
BUT 특정 클래스와 관계를 맺을 경우: 관계 클래스로 선언하는 것이 좋다
장점
1. 두 클래스의 멤버들은 서로 쉽게 접근할 수 있다.
2. 복잡성을 줄일 수 있다. (외부에 불필요한 관계 클래스를 감춤)
package ch09.nested_class;
public class A { // new 연산자를 사용해야 하는 인스턴스(객체)
// 필드
class B { // new 연산자를 사용해야 하는 인스턴스(객체)
// 필드
int field1;
static int field2; // 17버전 이후 부터 가능
// 생성자
B() {
}
// 메서드
void method1() {
System.out.println("B클래스 인스턴스 메서드 실행");
}
static void method2() {
System.out.println("B클래스 정적 메서드 실행");
}
} // 중첩 클래스(관계 클래스, 내부 클래스)
static class C { // new 연산자가 필요 없는 클래스
int field1;
static int field2;
C() {} //생성자
void method1() { //추상 클래스
System.out.println("정적 C클래스 인스턴스 메서드 실행");
};
static void method2() {
System.out.println("정적 C클래스 정적 메서드 실행");
}
}
// 생성자
// 메서드
void method() { //외부 A클래스의 메서드
class D { //메서드 내부에 있는 클래스기 때문에 내부에서만 호출 가능!
D() {}
int field1;
static int field2;
void method1() {
System.out.println("A클래스 > 메서드 > D클래스 > 메서드1 인스턴스 실행");
}
static void method2() {
System.out.println("A클래스 > 메서드 > D클래스 > 정적 메서드2 실행");
}
} //A클래스 > 메서드 > D클래스
D d = new D();
d.field1 = 50;
d.method1();
d.method2();
D.method2();
}
}
package ch09.nested_class;
import ch09.nested_class.A.B;
import ch09.nested_class.A.C;
public class AExam {
public static void main(String[] args) {
A.B.field2 = 50; //17부터 정적 필드 사용 가능
A.B.method2();
//방법1
A.B b = new A().new B(); //A의 객체를 만든 뒤 (A 안의)B의 객체 생성 가능
//방법2
A a = new A();
A.B b2 = a.new B();
b.field1 = 50;
b.method1();
A.C c = new A.C();
c.field1 = 50;
c.method1();
A.C.method2();
}
}