List 인터페이스에는 객체를 순서에 따라 저장하고 유지하는데 필요한 메서드가 선언되어 있다.
자바에서 배열을 구현한 클래스는 ArrayList, Vector가 있고 배열과 구현 방식은 다르지만 순차 자료구조를 구현한 LinkedList가 있다.
1. ArrayList 클래스
ArrayList는 객체 배열을 구현한 클래스로 객체 순서를 기반으로 순차적으로 자료를 관리하는 프로그램을 구현할 때 사용한다.
1. ArrayList를 활용해 회원 관리 프로그램 구현하기
- addMember() : 회원 추가
- removeMember(): 회원 삭제
- showAllMember(): 전체 회원 출력
2. MemberArrayList 테스트 클래스 구현하기
실습 코드는 여기서
2. ArrayList와 Vector 클래스
Vector는 자바2 이전부터 제공했으며 ArrayList 처럼 배열을 구현한 클래스다.
ArrayList와 Vector의 가장 큰 차이점은 동기화 지원 여부다. 동기화란 두 개 이상의 스레드가 동시에 Vector를 사용할 때 오류가 나지 않도록 실행 순서를 보장하는 것이다.
1. 스레드와 멀티스레드 프로그래밍
스레드란 하나의 작업 단위로 프로그램이 메모리에서 수행되려면 스레드 작업이 생성되야 한다.
이때 하나의 스레드만 수행되면 단일 스레드, 두개 이상의 스레드가 동시에 실행되면 멀티 스레드라고 한다. 멀티스레드 환경에서는 메모리에 동시에 접근하지 못하도록 순서를 맞추는 동기화를 한다.
ArrayList | 동기화 지원X |
Vector | 동기화 지원O |
단일 스레드 환경에서는 ArrayList를 사용하도록 권장하고 멀티 스레드 환경에서는 Vector를 사용하면된다.
Vector의 모든 메서드는 호출될 때마다 잠금과 해제가 일어나므로 ArrayList보다 수행 속도가 느리기때문이다. (메서드를 호출할 때 배열 객체에 잠금을 하고 메서드 수행 후 잠금을 해제함)
// ArrayList를 사용해서 구현하는데 동기화가 필요하면 Vector로 바꿀 필요X
Collections.synchronizedList(new ArrayList<String>());
3. LinkedList 클래스
배열은 처음 배열을 생성할 때 정적 크기로 선언하고 물리적 순서와 논리적 순서가 동일하며 연속된 자료구조를 구현한다. 선언한 크기 이상으로 요소가 추가되는 경우 크기가 더 큰 배열을 새로 생성하여 각 요소를 복사해야하는데 이러한 불편함을 개선한 자료구조가 링크드 리스트다.
1. 링크드 리스트 구조
링크드 리스트의 각 요소는 요소의 자료와 다음 요소의 주소를 저장하는 부분으로 구현된다.
마지막 요소는 가리키는 요소가 없기 때문에 null 혹은 0 을 저장한다.
2. 링크드 리스트에 요소 추가하기
링크드 리스트에 요소를 추가할 때 서로 가리키고 있는 주소 값만 변경해주면 된다.
3. 링크드 리스트의 요소 제거하기
링크드 리스트의 요소를 제거할 때 서로 가리키고 있는 주소 값만 변경해주면 된다.
4. 배열과 링크드 리스트의 다른점
사용하는 자료의 변동(삽입/삭제)가 많은 경우에 링크드 리스트를,
자료 변동이 거의 없는 경우 배열을 사용하는 것이 좋다.
1) 배열
생성할 때 용량을 지정하고 용량보다 더 많은 요소가 추가된 경우 용량을 늘려 가며 수행
어떤 요소의 위치(i번째)를 찾을 때 O(1)로 찾을 수 있음
2) 링크드 리스트
요소를 추가할 때마다 동적으로 요소의 메모리를 생성하므로 번거로움X
자료를 중간에 추가 삭제할 때 자료의 이동이 배열보다 적음
5. LinkedList 클래스 사용하기
<LinkedList 주요 메서드>
void add(E o) | LinkedList 맨 끝에 객체 추가 |
void add(int index, Object element) | LinkedList 지정된 위치(index)에 객체(element)를 추가 |
void addFirst(E o) | LinkedList 맨 앞에 객체 추가 |
Object removeLast() | LinkedList 맨 마지막 요소 제거 후 반환 |
4. ArrayList로 스택과 큐 구현하기
Queue는 먼저 추가된 데이터부터 꺼내서 사용하는(FIFO)방식이다.
Stack 클래스는 자바1부터 제공하였고 Queue는 인터페이스로 정의하여 PriorityQueue 등이 구현되어 있다.
1. ArrayList로 스택 구현하기
- push(): 스택에 자료 추가
- pop(): 스택에서 자료 꺼내기
- top: 스택에 가장 최근에 추가된 자료의 위치
2. ArrayList로 큐 구현하기
- enQueue(): 큐 맨뒤에 추가
- deQueue(): 큐의 맨 앞에서 꺼내기
5. Collection 요소를 순회하는 Iterator
Iterator(반복자)는 자바의 Collection에 저장되어있는 요소들을 순회하는 객체이다.
Collection 인터페이스를 구현한 객체에서 미리 정의되어있는 iterator() 메서드를 호출하여 참조한다.
Iterator ir = memberArrayList.iterator();
<Iterator를 사용하여 요소를 순회할 때 사용하는 메서드>
boolean hashNext() | 이후에 요소가 더 있는지를 체크하는 메서드 요소가 있다면 true 반환 |
E next() | 다음에 있는 요소 반환 |
'Java > Do It! 자바 프로그래밍' 카테고리의 다른 글
[JAVA] 12-5.컬렉션 프레임워크_Map 인터페이스 (0) | 2022.05.09 |
---|---|
[JAVA] 12-4.컬렉션 프레임워크_Set 인터페이스 (0) | 2022.05.09 |
[JAVA] 12-2.컬렌션 프레임워크_컬렉션 프레임워크 (0) | 2022.05.09 |
[JAVA] 12-1.컬렉션 프레임워크_제네릭 (0) | 2022.05.09 |
[JAVA] 11-4. 기본 클래스_Class 클래스 (0) | 2022.05.08 |