public class A {
// 인스턴스 필드
B field = new B(); // 가능
C field = new C(); // 가능
// 인스턴스 메소드
void method1() {
B var1 = new B(); // 가능
C var2 = new C(); // 가능
}
// 정적필드 초기화
// static B field3= new B() // 불가능
static C field4 = new C(); // 가능
// 정적 메소드
static void method2() {
// B var1 = new B(); // 불가능
C var2 = new C(); // 가능
}
//인스턴스 멤버 클래스
class B { }
// 정적 멤버 클래스
static class C { }
}
보시면 클래스 A안에 중첩클래스로 클래스 B와 정적멤버 클래스로 static 클래스 C가 있어요.
근데 책에서 빨간색이랑 주황색 즉 B클래스는 A클래스의 필드 또는 메소드로 static으로 인스턴스 생성이 불가능하다고 되어있는데
이 이유가 책에 안나와있어서 혼자서 나름 앞에꺼 내용을 더듬어서 추측을 해보았는데
맞는지좀 확인좀 부탁드리겠습니다.
먼저 클래스 B를 정적 필드로 초기화 할때 불가능한 이유는 만약 클래스 B를 static 필드로 선언하게 된다면,
field3은 객체 생성없이 B.field3 이런식으로 접근이 가능하다. 하지만 A 클래스 내부에 있는 클래스 B는 static 클래스가 아닌 일반 클래스이고 A의 멤버 클래스
이다. 따라서 외부에서 B에 접근을 하려면 먼저 A 의 인스턴스가 생성되어 있어야하고 이후에 B에 접근이 가능하다. 하지만 A의 필드를 static으로
선언을 하게된다면 A의 객체가 생성되지 않은채 접근이 가능하다는 뜻이 되므로 불가능함!
두번째로 정적메소드 method2() 에서 생성이 불가능한 이유는
마찬가지로 method2가 static으로 선언되었기 때문이다. method2가 static으로 정의되었기 때문에 객체 없이 method2를 호출 할 수 있으나
내부에 있는 클래스 B가 생성되기 위해서는 A 인스턴스가 존재해야 B 인스턴스를 생성할 수있기때문에 A의 메소드 method2를
객체 없이 호출 하는 이 상황에서는 생성이 불가능하다.
이렇게 제가 추측을 해보았는데요. 혹시 맞는 추측인지 확인좀 부탁드리곘습니다 좀 길긴한거같은데 부탁드려요 ㅜㅜ
감사합니다
댓글 0