。゚(*´□`)゚。

코딩의 즐거움과 도전, 그리고 일상의 소소한 순간들이 어우러진 블로그

[네이버클라우드] 클라우드 기반의 개발자 과정 7기/웹프로그래밍

[NC7기-38일차(6월19일)] - 웹프로그래밍 19일차

quarrrter 2023. 6. 19. 16:54

## 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값으로 재설정하기

 

완벽한 가비지로 만들기 위해 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>>: 규칙에 따라 작성: 구현

 

@Override

컨틀롤 쉬프트 o : import 하는 법 

 

java.util의 규칙을 따라서 만들고 있음 - 사실 자바에 이미 있음