JAVA

JAVA 컬렉션 LinkedList와 Node - 중첩(내부)클래스, 정적 중첩클래스 궁금증 정리

유혁스쿨 2023. 12. 13. 22:46
728x90
반응형
public class LinkedList<E> /* extends 생략 */ {

	/* 기타 멤버 생략 */

	private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;

        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }
}

위와 같이 자바 컬렉션 LinkedList의 내부를 보면 Node 중첩 클래스를 확인할 수 있다.

 

Node 클래스 설계 궁금증

  1. 중첩(내부) 클래스
    • Node 클래스는 LinkedList에서만 사용하기 위해 LinkedList의 중첩 (내부)클래스로 구현함으로써
      LinkedList의 순기능으로 높은 응집도를 갖게 된다.
  2. static
    Node 내부 클래스는 LinkedList 외부 클래스의 일반적인 멤버 자원을 사용하지 않으므로,
    메모리 낭비를 방지하기 위해서 static을 사용했다고 생각한다. 
    ( Node의 순기능은 단순히 LinkedList에 저장할 데이터와 연결된 앞,뒤의 Node 정보를 재귀형태로 저장하기 위함 )
    1. Non Static Nested Class 비정적 내부클래스 코드 예
      • public class LinkedList<E> /* extends 생략 */ {
            /* 기타 멤버 생략 */
            private class Node<E> { /* 생략 */ }
        }
        LinkedList.Node node = new LinkedList( ).new Node( );


        위 코드는 컴파일시 Node 클래스에 대한 주소값 뿐만 아니라 LinkedList에 대한 주소값도 함께 참조하게 된다.
        만약 LinkedList에 대한 멤버를 사용하지 않고 순수 Node에 대한 인스턴스만을 사용한다면
        LinkedList 주소참조에 대한 메모리 누수가 발생한다. 

      • 일반적인 내부 클래스는 외부 클래스의 모든 클래스 자원(정적,비정적 변수,메소드)을 직접 사용할 수 있다.
    2.  Static Nested Class 정적 중첩클래스 코드 예
      • public class LinkedList<E> /* extends 생략 */ {
            /* 기타 멤버 생략 */
            private static class Node<E> { /* 생략 */ }
        }
        LinkedList.Node node = new Node( );


        위 코드는 컴파일시 Node 클래스 인스턴스 주소값만 참조하게 된다.
        변수 타입이 LinkedList를 통해 Node클래스에 접근하고 있다.
        Node클래스는 LinkedList의 static중첩클래스이기 때문에 new LinkedList( ); 를 통해 LinkedList의 인스턴스를 생성하기 전에 static키워드에 의해 미리 메모리에 로드된다.
        이로인해 위와같이 순수하게 new Node( ); 만으로 인스턴스를 생성하였음에도 LinkedList.Node 타입으로 인스턴스화 된다.

        (Node클래스는 LinkedList클래스의 소속이므로 아무리 static이여도 LinkedList 클래스를 통해 접근할 수 있는것)

      • static 내부 클래스는 외부 클래스의 멤버(변수|메소드) 중 static키워드가 붙은 정적 멤버만 접근이 가능하다.
  3. private
    • 순수 LinkedList 클래스 내에서만 Node객체를 만들어 LinkedList의 Node참조용 Pointer로써 사용하는 클래스이기 때문에 다른 외부 패키지에서 인스턴스를 생성하여 접근하는것을 막기위함이다.

 

아래 레퍼런스에서 정적, 비정적 내부 클래스의 개념의 도움을 받았습니다.

 

https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EB%82%B4%EB%B6%80-%ED%81%B4%EB%9E%98%EC%8A%A4Inner-Class-%EC%9E%A5%EC%A0%90-%EC%A2%85%EB%A5%98

 

☕ 내부 클래스(Inner Class) 장점 & 종류 총정리

내부 클래스 (Inner Class) 내부 클래스(inner class)란 하나의 클래스 내부에 선언된 또 다른 클래스를 의미한다. 보통 사용자 클래스 자료형이 필요하면, 메인 클래스 외부에 선언하거나, 따로 독립적

inpa.tistory.com

 

https://devlog-wjdrbs96.tistory.com/206

 

[Java] 내부(inner) 클래스와 내부(inner) static 클래스의 차이

이번 글에서는 클래스 안에 클래스가 존재하는 경우에 대해서 정리해보려 한다. public class Test { class InnerClass { // InnerClass } static class InnerStaticClass { // static InnerClass } } 내부 클래스(Inner Class)란 위

devlog-wjdrbs96.tistory.com

 

 


https://velog.io/@agugu95/%EC%99%9C-Inner-class%EC%97%90-Static%EC%9D%84-%EB%B6%99%EC%9D%B4%EB%8A%94%EA%B1%B0%EC%A7%80

 

왜 Inner class에 Static을 붙이는거지?

클래스를 사용하면서 외부 인스턴스에 대한 참조가 필요없는 클래스를 선언 시 "Inner class may be static'이라는 경고가 떠서 알아봄

velog.io


https://tecoble.techcourse.co.kr/post/2020-11-05-nested-class/

 

정적, 비정적 내부 클래스 알고 사용하기

자바의 중첩 클래스(Nested Class)에는 여러 가지 종류가 있는데 그중 정적 내부 클래스와 비정적 내부 클래스에 대해 다뤄보고자 한다. 글에서 사용된 코드는 Github…

tecoble.techcourse.co.kr

 

728x90
반응형

'JAVA' 카테고리의 다른 글

JAVA  (0) 2021.01.20
JAVA의 이해를 돕기 위한 컴퓨터 & 프로그래밍의 이해  (0) 2021.01.20