• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

섹션 7. 정적중첩클래스

24.04.29 13:03 작성 24.04.29 13:06 수정 조회수 71

0

제가 이해를 잘 못한 거 같아서 질문 드립니다!

질문 1 : main에 NestedOuter outer = new NestedOuter();를 객체로 생성하면 내부에 있는 모든 것들이 생성되서 아래 올린 코드의 모든 것들이 저 객체 안에 생성되는 게 맞나요?

outInstanceValue, Nested 클래스도 같이 포함되어서 생성되는 거 아닌가 해서요!

 

질문 2 : Nested는 static인데 객체를 생성할 수가 있나요? static이면 힙 영역이 아니라 메서드영역에 생성되어있는 거 아닌가요?

 

질문 3 : 질문 2에 이어서 든 생각으로 NestedOuter.Nested.print()로 바로 꺼내 쓸 수 있어야 된다고 생각했는데 왜 안 되는 건가요?ㅠㅠ

 public class NestedOuterMain {

    public static void main(String[] args) {
        NestedOuter outer = new NestedOuter();
        NestedOuter.Nested nested = new NestedOuter.Nested();
        nested.print();

        System.out.println("nestedClass = " + nested.getClass());

    }
}
public class NestedOuter {

    private static int outClassValue = 3;
    private int outInstanceValue = 2;

    static class Nested {
        private int nestedInstanceValue = 1;

        public void print() {
            // 자신의 멤버에 접근 가능
            System.out.println("nestedInstanceValue = " + nestedInstanceValue);

            // 바깥 클래스의 인스턴스에 접근 불가
            //System.out.println(outInstanceValue);

            // 바깥 클래스의 클래스 멤버에 접근 가능
            System.out.println("outClassValue = " + outClassValue);
        }

    }

답변 1

답변을 작성해보세요.

2

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.05.01

안녕하세요, 인프런 AI 인턴입니다.

질문에 대한 답변을 드리겠습니다.

질문 1: NestedOuter 객체를 생성하면 NestedOuter 클래스의 인스턴스 변수인 outInstanceValue는 메모리에 할당됩니다. 그러나 정적 중첩 클래스인 Nested는 별도의 객체로 생성되지 않습니다. 즉, NestedOuter 객체 내에 Nested 클래스의 인스턴스가 자동으로 포함되지는 않습니다. Nested 클래스의 인스턴스를 만들기 위해서는 별도로 new NestedOuter.Nested()를 호출해야 합니다.

질문 2: 네, 정적 중첩 클래스인 Nested는 객체를 생성할 수 있습니다. 정적 중첩 클래스는 인스턴스에 속하지 않고, 외부 클래스의 정적 멤버처럼 취급됩니다. 따라서 외부 클래스의 인스턴스를 생성하지 않아도 new를 사용하여 Nested 클래스의 인스턴스를 생성할 수 있습니다. static이 비록 클래스가 메서드 영역에 로드되긴 하지만, 이는 클래스 자체에 대한 정보가 로드된다는 의미이고, 실제 인스턴스는 힙 영역에 생성됩니다.

질문 3: NestedOuter.Nested.print()를 바로 호출하려면 print() 메서드 역시 정적 메서드여야 합니다. 현재 print()는 인스턴스 메서드이므로, 이 메서드를 호출하려면 먼저 Nested 클래스의 인스턴스를 생성해야 합니다. static으로 선언된 메서드만이 클래스 이름을 통해 직접 호출될 수 있습니다. 따라서, Nested 클래스의 인스턴스를 생성한 후 print() 메서드를 호출하는 것이 필요합니다.

질문에 대한 답변이 되었길 바랍니다. 추가 궁금증이 있으시면 또 질문해 주세요.