해결된 질문
작성
·
129
·
수정됨
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 인턴입니다.
질문에 대한 답변을 드리겠습니다.
질문 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()
메서드를 호출하는 것이 필요합니다.
질문에 대한 답변이 되었길 바랍니다. 추가 궁금증이 있으시면 또 질문해 주세요.