2014-12-17 3 views
2

Eckel 's Thinking in Java 4 판 (625 페이지)에서 수정 된 다음 코드에서 정적 내부 클래스 사용에 대한 질문이 있습니다.정적 내부 클래스 사용

이 코드는 Node라는 정적 내부 클래스를 사용합니다. 스택 구조를 만들면 스택에 노드를 밀어 넣을 수 있습니다. 하지만 노드 클래스가 정적 인 이유에 대해 혼란 스럽습니다. LinkedStack 클래스에서 노드가 하나만 생성된다는 것을 의미하지 않습니까? 왜/왜 실제로 많은 다른 노드를 스택에 넣을 수 있고, 그런 다음 스택을 띄울 수 있습니까? (물론 스택이해야 할 일입니다.) 사실 private static class Node을 'private class Node`로 변경할 수 있으며 작동합니다 ... 왜 Eckels가 정적 클래스 Node를 선택 했습니까?

이 예제에서 입력은 "Phasers", "on", "stun!"의 세 단어입니다. 출력은 "stun!", "on", "Phasers"입니다. 방법 또는 필드의 문맥에서 사용될 때

public class LinkedStack<T> { 

    //generic inner class node 
    private static class Node<U> { 

     U item; 
     Node<U> next; 
     Node() { 
      item = null; 
      next = null; 
     } 
     Node(U item, Node<U> next) { 
      this.item = item; 
      this.next = next; 
     } 
     boolean isDummyNode() { 
      return item == null && next == null; 
     } 
    } 

    //initialize top of stack as a dummy first node 
    private Node<T> top = new Node<T>(); 

    public void push(T item) { 
     top = new Node<T>(item, top); 
    } 

    public T pop() { 
     T result = top.item; 
     if(!top.isDummyNode()) 
      top = top.next; 
     return result; 
    } 

    public static void main(String[] args) { 
     LinkedStack<String> stack = new LinkedStack<String>(); 
     for(String s : "Phasers on stun!".split(" ")) 
      stack.push(s); 
     String s; 
     while((s = stack.pop()) != null) 
      System.out.println(s); 
    } 

} 
+0

기타 질문에 대한 답변이 없습니다. 게다가 Eckel의 Java에 관한 책에서 질문이 나온 것이므로 분명히 읽고 연구하고 있습니다. 당신의 결정에 항소 할 수 있습니까? – topsail

+0

* 노드 클래스가 정적 인 이유에 대해 혼란 스럽습니까? * 중복 Q/A에서 설명합니다. * LinkedStack 클래스에서 단 하나의 Node가 생성된다는 것을 의미하지 않습니까? * 클래스이고 최상위 클래스 또는 내부 클래스 (로켓 과학이 아닙니다)에도 불구하고 클래스의 인스턴스를 여러 개 만들 수 있습니다. * 어떻게/왜 실제로 많은 다른 노드를 스택에 푸시 할 수 있습니까? * 인스턴스이며 원하는대로 동작하게 할 수 있습니다. 이 모든 것을 가지고, 당신의 질문은 왜 * 노드 클래스가 정적 인 지에 대한 것입니다. * 이것은 dup을 읽음으로써 대답 될 수 있습니다. –

+0

@topsail : 매력적이라면 자바에 골드 배지가있는 모든 사용자가 이것을 다시 열 수 있습니다. 또는 질문을 편집하면 다시 검토 대기열로 보내집니다. 하지만 당신이 키워드'정적'의 잘못된 이해를 놓아 줄 수 있다면 Luiggi의 링크 된 대답은 당신의 질문을 다루어야한다고 생각합니다. –

답변

0

정적 내부 클래스는 외부 클래스 (이 경우 LinkedStack)와 연결되며 인스턴스가 아닙니다. 비 정적 내부 클래스의 경우 외부 클래스의 인클로저 인스턴스이 있어야합니다. Node이 정적이 아니면 Node의 모든 인스턴스가 존재하는 경우 해당 인스턴스를 묶는 LinkedStack의 인스턴스가 있어야 함을 의미합니다.

클래스를 Node 클래스로 정적으로 지정하면 외부 클래스의 인스턴스에 바인딩되지 않은 최상위 클래스가됩니다. 따라서 다른 클래스는 Node의 인스턴스를 만들지 않고 LinkedStack의 인스턴스를 만들 수 있습니다.

차이점에 대한 자세한 내용은 Java 자습서의 Nested classes을 참조하십시오.

+0

좋아요, 당신의 대답은 Mark W의 대답과 매우 비슷합니다. 제 생각에 Eckel의 코드는이 클래스에 대해 노드를 정의하고 다른 곳에서는 사용할 수 없도록하는 것이 바람직하지 않습니다. . 아마도 교과서의 예가 더 쉬웠을 것입니다. 노드가 LinkedStack 외부에서 만들 수있는 것으로 의도 된 경우 LinkedStack의 내부 클래스로 만드는 것이 이상하게 보입니다. 어쨌든 그건 내 생각이야. – topsail

+0

@topsail'Node' 클래스는 처음에는 내부 클래스조차하지 않습니다. 내부 클래스는 정의에 따라 비 정적 중첩 클래스입니다. 'LinkedStack'은'Node'에 대한 네임 스페이스를 제공한다고 생각할 수 있습니다. 이것은 단순히 LinkedStack 안에 중첩 된 최상위 클래스입니다. – manouti

+0

감사합니다. 마지막 결론 (꼭 맞는 것은 아닙니다)은 정적 중첩 클래스에 특별한 이유가 없다는 것입니다. 어쨌든 private이기 때문에 Node는 LinkedStack 클래스 외부에서 생성 될 수 없습니다. 따라서 중첩 된 정적 클래스는 (정적이 아닌) 내부 클래스도 수행하지 않습니다. 플러스 (비 정적) 내부 클래스는 외부 클래스의 제네릭 형식 매개 변수 (T)에 액세스 할 수 있으며 정적 중첩 클래스가 사용해야하는 추가 제네릭이 필요하지 않습니다. – topsail

3

상관 정적 내부 클래스 클로징 타입의 인스턴스를 필요로 말아 클래스이며, 이는 정적과 같은 것은 아니다. 내부 클래스의 정적은 본질적으로 그것들을 최상위 클래스로 만듭니다. 정적이 아닌 내부 클래스를 선언하면 해당 유형의 인스턴스 필드와 메서드에 암시 적으로 액세스 할 수 있으므로 해당 유형의 인스턴스를 요구 사항으로 만듭니다. 정적 클래스는 그 사치품을 갖지 않으므로 둘러싸는 유형의 인스턴스가 필요하지 않습니다.

+1

하지만 우리는 명확하게 인스턴스화없이 LinkedStack을 사용할 수 없습니까? 무의미한 (그렇지 않으면 무의미한) 여기에 정적 노드를 갖는 것이 아닌가? – topsail

+0

LinkedStack에서 중첩 된'static class Node'는 많은 Node 객체를 가질 수 있다는 것을 의미합니까? 그러나'정적 클래스 Node'는 LinkedStack에 중첩되지 않을 때 노드가 하나만 있다는 것을 의미합니까? – topsail

관련 문제