## 20. LinkedList 자료구조 구현하기
- 목록 관리 범용 클래스 LinkedList 정의
- LinkedList 구동원리 이해 및 구현
- 중첩 클래스 활용
- MemberHandler와 BoardHandler에 적용
linkedList를 통해 인스턴스주소(레퍼런스)를 이해하고 있는지 알 수 있음.
취직에도 공부에도 겸사겸사 좋음
[전]
App - BoardHandler - ArrayList (Board를 포함)
[후]
App - BoardHandler - LinkedList (Board를 포함)
ArrayList vs LinkedList
ArrayList |
LinkedList |
|
초기 크기 | 일정 메모리 확보 (배열) |
0부터 시작 |
크기 증가 | O -> 기존 배열이 garbage가 됨 | O -> garbage가 없음. |
조회 | 인덱스로 조회 (LinkedList보다 속도 빠름) |
링크를 따라가서 조회 |
삽입, 삭제 | 삽입: 배열 값 밀기 삭제: 배열 값 당기기 |
링크를 통해 해당 값 찾고 노드 추가/삭제 ArrayList보다 빠름 |
LinkedList - add()
add(100);
add(200);
각각 100과 200 값을 가진 노드가 생성됨
노드는 값과 주소로 이루어져있는데 이때 담긴 주소는 다음 노드의 주소가 들어있음. 최초 값은 null
끝 노드를 나타내기 위해 tail이라는 변수에 끝 노드의 주소 값을 담음
LinkedList - getList()
head 등장
LinkedList - retrieve()
LinkedList - remove()
완벽한 가비지로 만들기 위해 null값으로 재설정하기
중간 항목 삭제: 가비지가 인스턴스를 가리킬때 문제점
garbage가 다음 노드를 가리킨다. 즉 레퍼런스 카운트가 늘어난다.
완벽한 가비지로 만들기 위해 null값으로 재설정하기
끝 항목 삭제:
끝 앞에서 첫번째 next: null
if(prev.next == null) {
tail = prev;}
첫 항목 삭제:
if(cursor == head) {
//삭제할 노드가 시작 노드라면
head = cursor.next;
시작이면서 끝인 항목 삭제
if(cursor == head) {
//삭제할 노드가 시작 노드라면
head = cursor.next;
//삭제할 노드가 끝 노드라면
if(head == null ) {
tail = null;
}
Node prev = null;: prev라는 이름의 Node 타입의 변수를 선언하고 null로 초기화합니다.
이 변수는 현재 노드의 이전 노드를 가리키는 역할을 합니다.
Node cursor = this.head;: cursor라는 이름의 Node 타입의 변수를 선언하고,
연결 리스트의 헤드(head) 노드를 할당합니다.
이 변수는 현재 순회하고 있는 노드를 가리키는 역할을 합니다.
while (cursor != null) { ... }: 현재 노드가 null이 아닐 때까지 반복하는 while 루프를 시작합니다.
이 루프는 연결 리스트를 처음부터 끝까지 순회하며 특정 값을 가진 노드를 찾을 때까지 반복됩니다.
if (cursor.value.equals(value)) { ... }: 현재 노드의 값이 찾으려는 값과 일치하는지 확인합니다.
value는 매개변수로 전달된 삭제할 값을 나타냅니다. 값이 일치할 경우 조건문이 실행됩니다.
if (prev == null) { ... }: 현재 노드가 헤드 노드일 경우 실행됩니다.
헤드 노드를 삭제하는 경우이므로, head를 현재 노드의 다음 노드(cursor.next)로 갱신합니다.
그리고 만약 head가 null이라면, 연결 리스트가 비어있는 상태이므로 tail도 null로 설정합니다.
else if (cursor.next == null) { ... }: 현재 노드가 마지막 노드일 경우 실행됩니다.
tail을 현재 노드의 이전 노드(prev)로 갱신하고, tail.next를 null로 설정하여 연결을 끊습니다.
else { ... }: 위의 두 경우가 아닌 경우 실행됩니다.
현재 노드가 리스트 중간에 위치한 경우로,
이전 노드(prev)의 next를 현재 노드의 다음 노드(cursor.next)로 갱신하여 연결을 끊습니다.
이후에는 삭제된 노드를 처리하고, size를 하나 감소시킨 후 true를 반환합니다.
prev = cursor;: 이전 노드(prev)를 현재 노드(cursor)로 갱신합니다.
오후수업
인터페이스를 이용하여 List 사용 규척 정의하기
interface: 규칙정의
인터페이스는 추상적인 개념으로, 일련의 메서드 시그니처를 정의하는 역할을 하며 다른 클래스에서 이 인터페이스를 구현하면, 해당 클래스는 인터페이스에 정의된 모든 메서드를 구현해야 한다.
<<concreate>>: 규칙에 따라 작성: 구현
컨틀롤 쉬프트 o : import 하는 법
java.util의 규칙을 따라서 만들고 있음 - 사실 자바에 이미 있음
'[네이버클라우드] 클라우드 기반의 개발자 과정 7기 > 웹프로그래밍' 카테고리의 다른 글
[NC7기-40일차(6월21일)] - 웹프로그래밍 21일차 (0) | 2023.06.21 |
---|---|
[NC7기-39일차(6월20일)] - 웹프로그래밍 20일차 (0) | 2023.06.20 |
[NC7기-37일차(6월16일)] - 웹프로그래밍 18일차 (0) | 2023.06.16 |
[NC7기-36일차(6월15일)] - 웹프로그래밍 17일차 (0) | 2023.06.15 |
[NC7기-35일차(6월14일)] - 웹프로그래밍 16일차 (0) | 2023.06.14 |