[JAVA] 정적 멤버 메소드에서 중첩클래스 객체 선언 사용 질문좀 드리겠습니다.

조회수 499회

클래스의 정적 멤버 메소드에서 중첩클래스의 사용관련하여 질문좀 하겠습니다..!

public class A {
    public static void methodA() {
        B b = new B(); // 에러
    }

    class B {
        // empty
    }
}

위 코드와 같이 A라는 클래스 내에 정적 멤버 메소드인 methodA가 존재하고 또 A클래스 내에 중첩클래스인 클래스 B가 존재하는 상황에서 클래스 B를 생성해서 사용하고 싶은데 에러가 나는 상황입니다. 왜 에러가 나는지 이해를 잘못하겠습니다.

친절하게도 개발툴에서 B클래스를 static으로 만들라고 친절하게 알려는 주던데..

'왜' static이어야하는지 잘 모르겠습니다.

이 코드는 가능하다는 것을 알고 있습니다.

public class A {
    public static void methodA() {
        B b = new B(); 
    }
}
class B {
        // empty
}

이 코드 같은경우에는 책에서도 뭐 정적블록에서 인스턴스 멤버를 사용하고 싶다면 객체를 먼저 생성후에 참조변수로 접근 해야한다라고 나와있어서 이해는 됩니다.

그런데 첫번째 코드는 잘 이해가 가질 않습니다.

methodA()가 static 선언되어있으므로 객체 생성없이도 접근이 가능해야할테지요.

그래서 첫번째 코드에서 두번째 코드처럼 정적 메소드안에서 객체 생성을 해줘 접근을 하는데

이건 왜 에러가나지요?

public class A {
    public static void methodA() {
        B b = new B(); // 에러
    }

    static class B {
        // empty
    }
}

처음에 말했다시피 B클래스에 static으로 변경해주면 해결되는 일이지만

왜 첫번째 코드를 두번째 코드처럼 하면 에러가나나요?

정적메소드 안에서는 인스턴트 접근불가능한데

중첩클래스도 인스턴스 판정이라 그런가요?

1 답변

  • JAVA의 문법적인 제약입니다.

    class A{
        class B{
            }
    }
    

    이렇게 하시면 원칙적으로 Java에서는 class B 는 class A의 멤버가 되는 것으로 알고 있습니다.

    class 내부에 아무런 키워드 없이 무엇인가를 선언하면, Java에서는 전부 해당 class의 멤버로 보는 것으로 알고 있습니다.

    따라서, JAVA에서는 생성되어지지도 않은 멤버에 대해 접근하는 것을 허용하지 않으므로 오류가 나는 것으로 여겨집니다.

    static 키워드를 붙여주시면. JAVA에서는 무슨 용어로 말하는지는 모르겠지만. class A의 class variable 이 되므로 접근이 가능한 것으로 보여집니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)