기사 출처: 인터넷 작성자: PaleSting/CSDN
이번 글에서는 Java의 데이터 유형을 살펴보겠지만 추상 데이터 유형(ADT)의 개념을 소개하겠습니다. 또한 Java 컬렉션 프레임워크를 소개하여 Java에서 정의한 일부 ADT에 대해 알아봅니다.
ADT
ADT는 보유하는 데이터 유형과 이 데이터 유형에 대해 수행할 수 있는 작업에 의해서만 정의됩니다. 개발자는 ADT의 작업 메서드를 통해서만 ADT의 속성에 액세스할 수 있으며 이 데이터 유형 내의 다양한 작업이 어떻게 구현되는지 알 수 없습니다.
Java에서는 이러한 작업 구현의 세부 사항을 공개하지 않고 작업 집합을 제공하기 위해 인터페이스를 사용하는 경우가 많습니다. 인터페이스는 메소드 세트를 정의하고 Java 클래스는 필수 조건을 충족하거나 인터페이스 인스턴스를 구현하기 위해 이 세트를 구현해야 한다는 점을 기억하십시오.
선형 테이블, 스택 및 큐
ADT에 대해 이야기할 때 우리는 종종 선형 목록, 스택 및 대기열에 대해 이야기합니다. 이러한 데이터 구조에 대해 자세히 설명하지는 않지만 ADT라고 불리는 이유에 대해서는 설명하겠습니다.
선형 목록은 선형 방식으로 배열된 유한 요소의 모음이며 해당 요소에 대한 직접 액세스를 제공합니다. 스택은 LIFO(후입선출) 순서의 선형 목록입니다. 요소는 스택 헤드에 추가되고 제거됩니다. 큐는 선입선출 순서의 선형 목록으로, 요소는 큐의 끝에서 추가되고 큐의 헤드에서 가져옵니다.
선형 목록, 스택 및 대기열의 내부 구조는 다양한 방법으로 구현될 수 있습니다. 예를 들어 순서 배열이나 연결 목록을 사용하여 각 구조를 구현할 수 있습니다. 핵심은 내부 구조를 어떻게 구현하더라도 외부 인터페이스는 항상 동일하게 유지된다는 것입니다. 이를 통해 공용 인터페이스를 변경하지 않고도 기본 구현을 수정하거나 업그레이드할 수 있습니다.
Java 컬렉션 아키텍처
Java 2 SDK(소프트웨어 개발 키트)는 가장 일반적으로 사용되는 ADT를 지원하는 새로운 클래스를 제공합니다. 이러한 클래스를 Java 컬렉션 클래스(MFC의 컬렉션 클래스와 유사)라고 하며 함께 작동하여 Java 컬렉션 아키텍처를 형성합니다. 이 컬렉션 아키텍처는 소위 컬렉션 추상 데이터로 데이터를 나타내는 인터페이스 및 클래스 세트를 제공합니다.
java.util.Collection 인터페이스는 객체 그룹, 즉 요소를 나타내는 데 사용됩니다. 이 인터페이스는 추가, 삭제, 쿼리와 같은 기본 작업을 제공합니다. Collection 인터페이스는 반복자 메서드도 제공합니다. iterator 메소드는 java.util.Iterator 인터페이스의 인스턴스를 리턴합니다. Iterator 인터페이스는 hasNext, next 및 delete 메소드를 제공합니다. Iterator 인터페이스에서 제공하는 메소드를 사용하면 Collection 객체의 인스턴스를 처음부터 끝까지 반복하고 반복자(커서)가 나타내는 요소를 안전하게 삭제할 수 있습니다.
java.util.AbstractCollection은 모든 컬렉션 아키텍처 클래스의 기초입니다. AbstractCollection 클래스는 iterator 및 size 메소드를 제외한 java.util.Collection 인터페이스의 모든 메소드 구현을 제공합니다. 이 두 가지 예외 메소드는 java.util.AbstractCollection을 상속하는 모든 하위 클래스에 의해 구현됩니다.
인터페이스를 구현하는 클래스는 모든 인터페이스 메서드의 구현을 제공해야 합니다. 컬렉션 아키텍처의 일부 인터페이스 메서드는 선택 사항이므로 특정 메서드가 구현되지 않았음을 호출자에게 알리는 방법이 있어야 합니다. 선택적 메서드가 구현되고 이 메서드가 구현되지 않으면 UnsupportedOperationException이 발생합니다. UnsupportedOperationException 클래스는 RuntimeException 클래스를 상속합니다. 이를 통해 호출자는 각 호출을 try-catch 쌍에 넣지 않고도 모든 컬렉션 작업을 호출할 수 있습니다.
선형 테이블 나열
List 인터페이스는 Collection 인터페이스를 상속하고 동일한 요소가 존재할 수 있도록 순서가 지정된 컬렉션을 정의합니다. List 인터페이스는 또한 숫자 인덱스 값을 사용하여 선형 목록의 요소 위치를 기반으로 Collection의 요소에 대해 작업을 수행하는 메서드를 추가합니다. 이러한 작업에는 추가, 가져오기, 설정 및 제거가 포함됩니다.
List 인터페이스는 listIterator 메소드도 제공합니다. 이 메소드는 선형 목록을 처음부터 끝까지 또는 끝에서 끝까지 탐색할 수 있게 해주는 java.util.ListIterator 인터페이스의 인스턴스를 반환합니다. java.util.ListIterator는 java.util.Iterator 인터페이스를 상속합니다. 따라서 해당 컬렉션이 나타내는 컬렉션의 요소 추가 및 수정을 지원합니다.
다음 예제에서는 목록 요소를 뒤에서 앞으로 순회하는 방법을 보여줍니다. 이를 수행하려면 순회가 시작되기 전에 목록의 마지막 요소 뒤에 ListIterator를 배치해야 합니다.
ListIterator iter = aList.listIterator(aList.size());
동안(iter.hasPrevious())
System.out.println(iter.previous().toString());
}
컬렉션 아키텍처는 List 인터페이스의 두 가지 구현인 LinkedList(연결된 목록)와 ArrayList(배열 목록, 즉 정적 목록)를 제공합니다. 두 구현 모두 해당 요소에 대한 무작위 액세스를 지원합니다. ArrayList 인스턴스는 배열 스타일 작업을 지원하고 배열 크기 조정 작업을 지원합니다. LinkedList의 인스턴스는 목록의 시작과 끝 부분에 요소를 추가, 제거 및 제공하기 위한 명시적인 지원을 제공합니다. 프로그래머는 이러한 새로운 방법을 사용하여 다음과 같이 LinedList를 스택이나 큐로 간단히 사용할 수 있습니다.
LinkedList aQueue = new LinkedList(aCollection);
aQueue.addFirst(newElement);
개체 anElement = aQueue.removeLast();
LinkedList aStack = new LinkedList(aCollection);
aStack.addFirst(newElement);
객체 anElement= aStack.removeFirst();
표 A의 코드 조각은 java.util.ArrayList 및 java.util.LinkedList를 사용하여 java.util.List 인터페이스의 구현 인스턴스에 대한 몇 가지 일반적인 작업을 보여줍니다. 이러한 작업에는 요소 추가, 요소 무작위 액세스, 목록 끝에서 요소 명시적 제거가 포함됩니다.
무슨 일이 일어나고 있는지 알고 그 이유를 모르는 것은 큰 유익이 됩니다.
ADT는 개체의 공용 인터페이스 작업을 구체적인 구현과 분리하기 위한 강력한 도구를 제공합니다. 이를 통해 ADT 구현은 공개 인터페이스를 변경하지 않은 상태로 유지하면서 변경 및 발전할 수 있습니다. Java 컬렉션 아키텍처는 기본 요소 컬렉션을 나타내고 유용한 ADT를 만드는 데 사용할 수 있는 수많은 인터페이스와 구현을 제공합니다.