12-3 List 인터페이스

* 간단한 멤버십 관리 프로그램을 만들어 컬렉션 프레임워크에서 제공하는 각 클래스를 실습해 봅시다.

다음 멤버 클래스는 향후 연습에서 계속 사용됩니다.


Example01_멤버 클래스

목록 인터페이스

List 인터페이스는 올바른 순서로 개체를 저장하고 유지 관리하는 데 필요한 메서드를 선언합니다.

배열은 대표적인 순차 데이터 구조이며, ArrayList와 Vector는 Java에서 배열을 구현한 대표적인 클래스입니다.

LinkedList는 배열과 구현 방식이 다르지만 순차적인 데이터 구조를 구현합니다.

ArrayList 클래스

객체 순서에 따라 데이터를 순차적으로 관리하는 프로그램을 구현할 때 사용합니다.

ArrayList를 이용한 회원 관리 프로그램 구현

ArrayList를 사용하는 MemberArrayList 클래스에는 다음 세 가지 메서드가 제공됩니다.

  • addMember( ) 멤버 추가
  • removeMember()는 구성원을 제거합니다.

  • 모든 멤버를 출력하기 위한 showAllMember( )

각 메서드의 코드는 Collection 인터페이스에서 선언되고 ArrayList에서 구현되는 add() 및 get()과 같은 메서드를 사용합니다.

ArrayList를 사용하여 구성원을 추가하고 구성원을 삭제하고 정보를 표시해 보겠습니다.


Example02_ArrayList의 활용

get() 메소드를 사용하여 멤버를 순차적으로 가져온 후 멤버 ID가 파라미터와 일치하면 해당 멤버를 삭제합니다.

루프가 끝날 때까지 ID를 찾지 못하면 명령문이 실행되고 메서드의 반환 유형이 부울이므로 false가 반환됩니다.

(멤버가 성공적으로 삭제된 경우 true 값 반환)

showAllMember( ) 메서드에서 확장된 for 문을 사용하여 배열의 요소를 하나씩 검색하여 표시합니다.

멤버 클래스에서 재정의된 toString( )그만큼 호출 시 멤버 정보가 출력됩니다.

다음은 클래스 Example02_MemberArrayList의 멤버를 직접 추가 및 삭제하고 프로그램이 잘 구현되었는지 확인하는 클래스이다.


Example03_Example02 테스트 클래스

ArrayList 및 벡터 클래스

ArrayList와 Vector의 가장 큰 차이점은 동기화 지원 여부입니다.

동기화의 목적은 두 개 이상의 스레드가 동시에 벡터를 사용할 때 오류가 발생하지 않도록 실행 순서를 보장하는 것입니다.

스레드 및 다중 스레드 프로그래밍

간단히 말해서 스레드는 작업 단위입니다.

프로그램이 메모리에서 실행되려면 스레드 작업이 생성되어야 합니다.

스레드가 하나만 실행되는 이 시점에서 단일 스레드둘 이상의 스레드가 동시에 실행 중일 때 멀티스레딩그것은 말한다.

둘 이상의 스레드가 동시에 실행 중일 때 동일한 메모리 공간에 액세스하고 있기 때문에 변수 값이나 메모리 상태의 오류가 발생할 수 있습니다.

동기화오전.

동기화를 구현하기 위해 동시에 작업 중인 리소스에 대해 잠금이 수행됩니다.

이 과정은 Vector에서 이루어지며 실행 속도가 ArrayList보다 느리므로 다중 스레드 환경이 아닌 경우 ArrayList를 사용하십시오.

ArrayList로 구현하는 것을 권장하지만 Vector로 전환하는 대신 프로그램에서 나중에 동기화가 필요한 경우

다음과 같이 ArrayList 생성 코드를 작성할 수 있습니다.


LinkedList 클래스

배열은 처음 생성될 때 정적 크기로 선언되며 물리적 순서와 논리적 순서는 동일합니다.

데이터가 중간에 삽입되거나 삭제되면 나머지 데이터를 이동시켜 빈 공간을 만들지 않고 연속적인 데이터 구조를 구현합니다.

원래 선언된 배열 크기 이상으로 요소가 추가되면 더 큰 크기의 새 배열을 만들고 각 요소를 복사해야 합니다.

이러한 번거로움을 개선한 데이터 구조 LinkedList그것은 말한다.

관련된 위험의 각 요소는 다음과 같습니다.

요소의 재료그리고 다음 요소를 가리키는 주소 값가지다

따라서 물리적인 저장소가 분리되어 있어도 논리적인 앞뒤 순서가 있습니다.

동일한 List 인터페이스를 구현한 ArrayList에 비해 중간에 데이터를 삽입하거나 삭제하는 데 걸리는 시간이 적습니다.

크기를 동적으로 늘릴 수 있다는 장점이 있습니다.

* null 값을 저장하거나 다음 항목을 가리키는 요소가 없으면 0을 저장합니다.

* 연결 리스트 중간에 항목을 추가할 때 서로를 가리키는 주소 값만 변경하면 됩니다.

* 연결된 리스트에서 항목을 제거할 때 주소 값만 변경하면 제거된 메모리가 가비지 수집기에 의해 수집됩니다.

배열과 연결 리스트의 차이점

어레이는 생성될 때 용량을 지정하고 용량보다 더 많은 요소가 추가됨에 따라 용량을 늘립니다.

그러나 연결된 목록은 항목을 추가할 때 항목에 대한 미리 알림을 동적으로 생성합니다.

Linked List는 데이터가 중간에 추가되거나 삭제될 때 배열보다 데이터 이동이 적습니다.

하지만 배열의 경우 요소의 위치를 ​​찾는 것이 연결 리스트보다 편리하고 구현하기 쉽습니다.

즉, 사용하는 데이터의 변동이 심할 때는 연결 리스트를 사용하고 데이터의 변동이 적을 때는 배열을 사용하는 것이 효율적이다.

LinkedList 클래스 사용


테스트 예시04_ArrayList

LinkedList 클래스를 사용하면 연결된 목록의 시작 또는 끝에서 항목을 추가하거나 제거할 수 있습니다.

addFirst(), addLast(), removeFirst() 및 removeLast() 메소드가 있습니다.

ArrayList로 스택 및 대기열 구현

스택은 LIFO(Last In First Out)입니다.

대기열은 선입선출(FIFO) 방식입니다.

ArrayList로 스택 구현

스택은 가장 최근에 추가된 데이터를 먼저 반환합니다.

스택에 데이터를 추가하는 것을 push()라고 하고 스택에서 데이터를 제거하는 것을 pop()이라고 합니다.

그리고 스택에서 가장 최근에 추가된 데이터의 위치를 ​​최상위라고 합니다.


예시 05_스택 구현

push()에서 add() 메서드를 사용하여 ArrayList의 끝에 요소를 추가합니다.

그리고 pop( ) 메서드의 17번째 줄은 ArrayList에서 마지막으로 추가된 요소를 제거하고 반환합니다.

ArrayList로 큐 구현


예 06_대기열 구현

enQueue( )에서 add( ) 메서드를 사용하여 ArrayList의 끝에 요소를 추가합니다.

컬렉션의 요소를 반복하는 반복자

정렬되지 않은 Set 인터페이스를 구현하는 경우 get(i) 메서드를 사용할 수 없으며 이 경우 iterator가 사용됩니다.

Iterator는 Collection 인터페이스를 구현한 객체에 미리 정의된 iterator( ) 메서드를 호출하여 참조합니다.

예를 들어 Collection을 구현하는 ArrayList에서 iterator( ) 메서드를 호출하면 Iterator 클래스가 반환됩니다.

다음과 같이 반복자형 변수에 할당하여 사용합니다.


반복자로 요소를 반복할 때 사용되는 방법

반복자로 모든 요소를 ​​반복할 때 다음 두 가지 방법이 사용됩니다.

방법 설명
부울 HashNext() 이 메서드는 뒤에 다른 요소가 있는지 확인합니다.


요소가 존재하면 true를 반환합니다.

E 다음( ) 다음 요소를 반환합니다.

다음은 MemberArrayList 클래스의 removeMember( ) 메소드를 변경하기 전과 후이다.


Example07_removeMember( ) 변경 전

Example08_removeMember( ) 변경 후