java.util.AbstractSequentialList 클래스는 Java Collection Framework의 일부로, 순차적으로 접근 가능한 데이터를 포함하는 추상 클래스입니다. 이 클래스는 java.util.List 인터페이스를 구현하고 있으며, 자식 클래스에서 정의해야 하는 일부 추상 메서드를 가지고 있습니다.
AbstractSequentialList는 순차적인 데이터에 액세스할 수 있는 방법을 제공하는 컬렉션입니다. 이 클래스는 인덱스가 있는 요소의 컬렉션을 나타내는 java.util.List 인터페이스를 구현합니다. 이러한 요소는 순서대로 저장되어 있으며, 순서에 따라 액세스할 수 있습니다.
AbstractSequentialList 클래스는 추상 클래스이므로 직접 인스턴스화할 수 없습니다. 대신에, 이 클래스를 상속받아 구체적인 자식 클래스를 만들어 사용해야 합니다. 이 자식 클래스에서는, add(), get(), remove()와 같은 일부 메서드를 구현해야 합니다.
AbstractSequentialList의 일부 메서드는 자식 클래스에서 구현되어야 하는 추상 메서드입니다. 이러한 메서드는 다음과 같습니다.
abstract void add(int index, E element) : 지정된 위치에 요소를 추가합니다.
abstract ListIterator<E> listIterator(int index) : 지정된 위치에서 시작하는 새로운 리스트 반복자를 반환합니다.
abstract E remove(int index) : 지정된 위치의 요소를 제거합니다.
abstract E set(int index, E element) : 지정된 위치의 요소를 새 요소로 대체합니다.
이 외에도, AbstractSequentialList 클래스는 List 인터페이스의 다른 메서드를 구현하고 있습니다. 이 클래스를 상속하여 새로운 컬렉션을 만들 때에는, 자식 클래스에서 이러한 메서드를 오버라이드할 수도 있습니다.
AbstractSequentialList 클래스는 Collections Framework에서 중요한 역할을 담당하고 있습니다. 이 클래스를 상속하여 새로운 컬렉션을 만들 때, 컬렉션의 동작 방식을 구체화할 수 있습니다. AbstractSequentialList 클래스를 사용하면 순차적으로 데이터에 액세스할 수 있으므로, 많은 유형의 데이터를 처리하는 데 사용할 수 있는 유용한 도구입니다.
AbstractSequentialList 클래스의 일부 메서드는 List 인터페이스의 메서드를 구현하고 있습니다. 이러한 메서드는 다음과 같습니다.
boolean add(E element) : 리스트의 끝에 요소를 추가합니다.
boolean addAll(Collection<? extends E> c) : 지정된 컬렉션의 모든 요소를 리스트의 끝에 추가합니다.
boolean addAll(int index, Collection<? extends E> c) : 지정된 위치에서부터 지정된 컬렉션의 모든 요소를 추가합니다.
void clear() : 리스트에서 모든 요소를 제거합니다.
boolean contains(Object o) : 리스트가 지정된 요소를 포함하고 있는지 여부를 반환합니다.
boolean containsAll(Collection<?> c) : 리스트가 지정된 컬렉션의 모든 요소를 포함하고 있는지 여부를 반환합니다.
boolean equals(Object o) : 지정된 객체가 이 리스트와 같은지 여부를 반환합니다.
E get(int index) : 지정된 위치의 요소를 반환합니다.
int hashCode() : 이 리스트의 해시 코드를 반환합니다.
int indexOf(Object o) : 지정된 요소의 첫 번째 발견 위치를 반환합니다.
boolean isEmpty() : 리스트가 비어 있는지 여부를 반환합니다.
Iterator<E> iterator() : 리스트의 요소를 반복하는데 사용할 수 있는 반복자를 반환합니다.
int lastIndexOf(Object o) : 지정된 요소의 마지막 발견 위치를 반환합니다.
ListIterator<E> listIterator() : 리스트의 요소를 반복하는데 사용할 수 있는 리스트 반복자를 반환합니다.
boolean remove(Object o) : 리스트에서 지정된 요소를 제거합니다.
E remove(int index) : 지정된 위치의 요소를 제거합니다.
boolean removeAll(Collection<?> c) : 지정된 컬렉션의 모든 요소를 리스트에서 제거합니다.
boolean retainAll(Collection<?> c) : 지정된 컬렉션의 요소만을 리스트에서 유지합니다.
E set(int index, E element) : 지정된 위치의 요소를 새 요소로 대체합니다.
int size() : 리스트의 요소 수를 반환합니다.
List<E> subList(int fromIndex, int toIndex) : 지정된 범위의 부분 리스트를 반환합니다.
Object[] toArray() : 리스트의 요소를 배열에 복사하여 반환합니다.
<T> T[] toArray(T[] a) : 리스트의 요소를 지정된 배열에 복사하여 반환합니다.
이러한 메서드는 AbstractSequentialList 클래스에서 기본 구현을 제공하며, 자식 클래스에서 오버라이드할 수 있습니다. AbstractSequentialList 클래스에서 구현하지 않은 메서드들은 자식 클래스에서 반드시 구현되어야 합니다.
AbstractSequentialList 클래스는 ArrayList 및 LinkedList와 같은 구체적인 리스트 클래스의 부모 클래스로 사용될 수 있습니다. 이러한 자식 클래스에서는, AbstractSequentialList 클래스에서 정의된 추상 메서드들을 구현함으로써, 순차적인 데이터를 처리할 수 있는 컬렉션을 만들 수 있습니다. 예를 들어, LinkedList 클래스는 AbstractSequentialList 클래스를 상속하고, 이를 구현하여 이중 연결 리스트로 리스트를 구현합니다. LinkedList 클래스에서는 리스트의 요소를 차례로 탐색하면서 데이터를 처리하기 때문에, AbstractSequentialList 클래스에서 제공하는 메서드들이 매우 유용하게 사용됩니다.
AbstractSequentialList 클래스는 또한 ListIterator 인터페이스를 구현하는 protected 메서드를 제공합니다. 이를 통해 자식 클래스에서 ListIterator 인터페이스를 더 쉽게 구현할 수 있습니다. 예를 들어, LinkedList 클래스에서는 AbstractSequentialList 클래스에서 제공하는 ListIterator 메서드를 사용하여, 리스트 요소의 순차적인 접근을 구현하고 있습니다.
AbstractSequentialList 클래스는 자바 컬렉션 프레임워크의 일부입니다. 이 클래스와 List 인터페이스는 자바에서 리스트를 다루는데 매우 중요한 역할을 합니다. 이 클래스와 인터페이스를 사용하면, 리스트 데이터를 순차적으로 처리하는데 필요한 기본 메서드들을 쉽게 구현할 수 있습니다. 또한, 이를 상속받아 자신만의 리스트 클래스를 만들 수 있습니다.
AbstractSequentialList 클래스는 추상 클래스이므로, 직접 인스턴스를 생성할 수 없습니다. 하지만, 이 클래스를 상속받아 새로운 리스트 클래스를 만들 수 있습니다. 아래는 AbstractSequentialList 클래스를 상속받아 자식 클래스를 만들어, 리스트를 구현하는 간단한 예제 코드입니다.
import java.util.AbstractSequentialList;
import java.util.ListIterator;
public class MyLinkedList<E> extends AbstractSequentialList<E> {
private Node<E> head;
private Node<E> tail;
private int size;
public MyLinkedList() {
head = null;
tail = null;
size = 0;
}
@Override
public ListIterator<E> listIterator(int index) {
return new MyListIterator(index);
}
@Override
public int size() {
return size;
}
@Override
public boolean add(E element) {
Node<E> newNode = new Node<>(element, null, null);
if (head == null) {
head = newNode;
tail = newNode;
} else {
newNode.setPrev(tail);
tail.setNext(newNode);
tail = newNode;
}
size++;
return true;
}
@Override
public E remove(int index) {
Node<E> nodeToRemove = getNodeAtIndex(index);
E element = nodeToRemove.getElement();
Node<E> prevNode = nodeToRemove.getPrev();
Node<E> nextNode = nodeToRemove.getNext();
if (prevNode != null) {
prevNode.setNext(nextNode);
} else {
head = nextNode;
}
if (nextNode != null) {
nextNode.setPrev(prevNode);
} else {
tail = prevNode;
}
size--;
return element;
}
private Node<E> getNodeAtIndex(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException();
}
Node<E> currentNode = head;
for (int i = 0; i < index; i++) {
currentNode = currentNode.getNext();
}
return currentNode;
}
private class Node<E> {
private E element;
private Node<E> prev;
private Node<E> next;
public Node(E element, Node<E> prev, Node<E> next) {
this.element = element;
this.prev = prev;
this.next = next;
}
public E getElement() {
return element;
}
public void setElement(E element) {
this.element = element;
}
public Node<E> getPrev() {
return prev;
}
public void setPrev(Node<E> prev) {
this.prev = prev;
}
public Node<E> getNext() {
return next;
}
public void setNext(Node<E> next) {
this.next = next;
}
}
private class MyListIterator implements ListIterator<E> {
private Node<E> nextNode;
private Node<E> lastReturnedNode;
private int nextIndex;
public MyListIterator(int index) {
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException();
}
nextNode = getNodeAtIndex(index);
nextIndex = index;
lastReturnedNode = null;
}
@Override
public boolean hasNext() {
return nextIndex < size;
}
@Override
public E next() {
if (!hasNext()) {
throw new IndexOutOfBoundsException();
}
lastReturnedNode = nextNode;
nextNode = nextNode.getNext();
nextIndex++;
return lastReturnedNode.getElement();
}
@Override
public boolean hasPrevious() {
return nextIndex > 0;
}
@Override
public E previous() {
if (!hasPrevious()) {
throw new IndexOutOfBoundsException();
}
if (nextNode == null) {
nextNode = tail;
} else {
nextNode = nextNode.getPrev();
}
lastReturnedNode = nextNode;
nextIndex--;
return lastReturnedNode.getElement();
}
@Override
public int nextIndex() {
return nextIndex;
}
@Override
public int previousIndex() {
return nextIndex - 1;
}
@Override
public void remove() {
if (lastReturnedNode == null) {
throw new IllegalStateException();
}
Node<E> prevNode = lastReturnedNode.getPrev();
Node<E> nextNode = lastReturnedNode.getNext();
if (prevNode != null) {
prevNode.setNext(nextNode);
} else {
head = nextNode;
}
if (nextNode != null) {
nextNode.setPrev(prevNode);
} else {
tail = prevNode;
}
if (nextNode == null) {
nextIndex--;
}
size--;
lastReturnedNode = null;
}
@Override
public void set(E element) {
if (lastReturnedNode == null) {
throw new IllegalStateException();
}
lastReturnedNode.setElement(element);
}
@Override
public void add(E element) {
Node<E> newNode = new Node<>(element, null, null);
if (head == null) {
head = newNode;
tail = newNode;
} else if (nextNode == null) {
newNode.setPrev(tail);
tail.setNext(newNode);
tail = newNode;
} else {
Node<E> prevNode = nextNode.getPrev();
newNode.setPrev(prevNode);
prevNode.setNext(newNode);
newNode.setNext(nextNode);
nextNode.setPrev(newNode);
}
size++;
nextIndex++;
lastReturnedNode = null;
}
}
위의 코드에서는 MyLinkedList 클래스를 AbstractSequentialList 클래스를 상속받아 구현하고 있습니다. MyLinkedList 클래스에는 요소를 저장하는 노드를 나타내는 Node 클래스와, 리스트 요소를 탐색하고 조작하는 ListIterator 클래스가 있습니다.
MyLinkedList 클래스는 add 메서드와 remove 메서드를 구현하여, 리스트에 요소를 추가하거나 삭제할 수 있도록 합니다. 또한, listIterator 메서드를 오버라이드하여, ListIterator 인터페이스를 구현합니다. 이를 통해 리스트 요소를 탐색하고 조작하는 다양한 메서드들을 제공합니다.
이 예제 코드는 LinkedList와 같은 링크드 리스트를 구현하는 방법을 보여줍니다. 이 코드를 기반으로, 더 다양한 리스트를 구현할 수 있습니다.
'PT선생님의 코딩 강좌' 카테고리의 다른 글
[PT선생님][54]javax.swing.AbstractSpinnerModel 알아보기 (0) | 2023.03.04 |
---|---|
[PT선생님][53]java.util.AbstractSet 알아보기 (0) | 2023.03.04 |
[PT선생님][51]java.nio.channels.spi.AbstractSelector 알아보기 (0) | 2023.03.03 |
[PT선생님][50]java.nio.channels.spi.AbstractSelectionKey 알아보기 (0) | 2023.03.03 |
[PT선생님][49]java.nio.channels.spi.AbstractSelectableChannel 알아보기 (0) | 2023.03.03 |