"그래서 두 번째 주제는 정적 중첩 클래스입니다. 비정적 중첩 클래스는 내부 클래스 라고 합니다 .
"내포된 클래스 선언의 맥락에서 정적이라는 단어가 무엇을 의미하는지 머리를 감싸봅시다. 어떻게 생각하세요?"
"변수가 정적으로 선언되면 변수의 복사본이 하나만 존재합니다. 따라서 중첩 클래스가 정적이면 해당 클래스의 개체를 하나만 만들 수 있다는 의미입니까?"
" 정적이라는 단어에 혼동하지 마십시오 . 변수가 정적으로 선언되면 변수의 복사본이 하나만 있는 것은 사실입니다. 그러나 정적 중첩 클래스는 이 점에서 정적 메서드에 가깝습니다. 클래스 선언 앞의 단어 static은 클래스가 외부 클래스의 개체에 대한 참조를 저장하지 않음을 나타냅니다."
"아. 일반 메서드는 개체 참조를 암시적으로 저장하지만 정적 메서드는 그렇지 않습니다. 정적 클래스도 마찬가지입니다. 엘리, 맞습니까?"
"물론입니다. 당신의 빠른 이해는 칭찬할 만합니다. 정적 중첩 클래스에는 외부 클래스의 개체에 대한 숨겨진 참조가 없습니다."
class Zoo
{
private static int count = 7;
private int mouseCount = 1;
public static int getAnimalCount()
{
return count;
}
public int getMouseCount()
{
return mouseCount;
}
public static class Mouse
{
public Mouse()
{
}
public int getTotalCount()
{
return count + mouseCount; // Compilation error.
}
}
}
"이 예를 주의 깊게 검토해 봅시다."
"정적 getAnimalCount 메소드가 액세스할 수 있는 변수는 무엇입니까?"
"정적인 방법만요. 정적 방법이니까요."
"getMouseCount 메소드가 액세스할 수 있는 변수는 무엇입니까?"
"정적 및 비정적 둘 다. Zoo 개체에 대한 숨겨진 참조(this)가 있습니다."
"그렇습니다. 따라서 정적 내포된 Mouse 클래스는 정적 메서드와 마찬가지로 Zoo 클래스의 정적 변수에 액세스할 수 있지만 비정적 변수에는 액세스할 수 없습니다."
"단일 Zoo 개체가 생성되지 않은 경우에도 마우스 개체를 안전하게 생성할 수 있습니다. 다음과 같이 할 수 있습니다."
class Home
{
public static void main(String[] args)
{
Zoo.Mouse mouse = new Zoo.Mouse();
}
}
"Mouse 클래스는 실제로 매우 일반적인 클래스입니다. Zoo 클래스 내부에 선언되어 있다는 사실은 두 가지 특별한 기능을 제공합니다."
1) 외부 클래스 외부에 중첩 클래스(예: Mouse 클래스)의 객체를 생성할 때 점 연산자를 사용하여 외부 클래스의 이름을 지정해야 합니다.
"예를 들면 다음과 같습니다. Zoo.Mouse."
2) Zoo.Mouse 클래스와 해당 개체는 Zoo 클래스의 전용 정적 변수 및 메서드에 액세스할 수 있습니다(Mouse 클래스도 Zoo 클래스 내에서 선언되기 때문).
"오늘은 여기까지입니다."
"그럼 이름만 추가하면 되는 건가요?"
"예."
"처음에 생각했던 것보다 훨씬 쉽습니다."
GO TO FULL VERSION