Fundamentals of Data Structure 수업에서 LinkedList를 구현하는 과제가 나왔다.
skeleton code의 architecture를 살펴보니
따라서 LinkedList를 구현하기 위해 Node 클래스 생성은 불가피하므로 Department, Student를 저장하기 위한 각 Node들을 해당 클래스 내부에 생성하고자 했다.
이 때, 당연히 각 클래스마다 내부적으로 처리하는 정보이므로 private로 설정했는데
이걸 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 참조)
바깥 클래스의 인스턴스에 묶이지 않음.
그냥 “DepartmentLinkedList 안에 정의된 독립적인 클래스”일 뿐.
따라서 DepartmentNode 객체는 자기 자신(department, students, next)만 들고 있고, DepartmentLinkedList의 멤버에는 접근 불가. 필요한 건 오직 head 포인터를 통해 연결하는 것뿐이니까 더 적절함.
DepartmentLinkedList (1개)
head ─► Node1 ─► Node2 ─► Node3 ...
(필드만 저장: dept, students, next)
DepartmentLinkedList (1개)
head ─► Node1 ─► Node2 ─► Node3 ...
(필드 + this$0)
▲
└── DepartmentLinkedList 객체를 가리킴 (중복 참조)