Java static

Nitroblue 1·2025년 9월 22일

개발 잡담

목록 보기
2/3

Fundamentals of Data Structure 수업에서 LinkedList를 구현하는 과제가 나왔다.

skeleton code의 architecture를 살펴보니

  • Main
  • DepartmentLinkedList
  • StudentLinkedList
    였다.

따라서 LinkedList를 구현하기 위해 Node 클래스 생성은 불가피하므로 Department, Student를 저장하기 위한 각 Node들을 해당 클래스 내부에 생성하고자 했다.

이 때, 당연히 각 클래스마다 내부적으로 처리하는 정보이므로 private로 설정했는데
이걸 static으로 선언해야 하는지 그냥 선언해야 하는지 헷갈렸다.

Static inner class vs non-static inner class

non-static 내부 클래스

바깥 클래스(여기서는 DepartmentLinkedList)의 인스턴스를 묵시적으로 참조한다.
즉, DepartmentNode 안에서는 외부 DepartmentLinkedList.this 에 접근할 수 있다.

문제: 사실 Node는 바깥 리스트 객체(DepartmentLinkedList)랑 직접적인 관계가 필요 없는데, 쓸데없이 참조가 생겨버림 → 메모리 낭비 + 구조 혼란.

이 경우, DepartmentNode는 항상 외부 DepartmentLinkedList 인스턴스와 묶여서 생성됩니다.

자바 컴파일러가 자동으로 숨겨진 참조 필드(DepartmentLinkedList this$0)를 Node 안에 추가해버려요.

즉, new DepartmentNode("EE")가 생성되면 실제 내부 구조는:
department, students, next, this$0 (DepartmentLinkedList 참조)
따라서 DepartmentNode가 몇 개든, 각각이 자기 바깥 리스트 객체를 가리키는 포인터를 하나씩 들고 있음.

하지만 실제 코드에서는 이 참조를 쓰지 않음 → 불필요한 메모리 낭비.
department, students, next, this$0 (DepartmentLinkedList 참조)

static 내부 클래스

바깥 클래스의 인스턴스에 묶이지 않음.
그냥 “DepartmentLinkedList 안에 정의된 독립적인 클래스”일 뿐.

따라서 DepartmentNode 객체는 자기 자신(department, students, next)만 들고 있고, DepartmentLinkedList의 멤버에는 접근 불가. 필요한 건 오직 head 포인터를 통해 연결하는 것뿐이니까 더 적절함.


그림 비교

static
DepartmentLinkedList (1개)
   head ─► Node1 ─► Node2 ─► Node3 ...
                 (필드만 저장: dept, students, next)
non-static
DepartmentLinkedList (1개)
   head ─► Node1 ─► Node2 ─► Node3 ...
                 (필드 + this$0)
                        ▲
                        └── DepartmentLinkedList 객체를 가리킴 (중복 참조)

0개의 댓글