프로그래밍/java

[자바 / Java ] List 인터페이스 ( ArrayList , LinkedList, Stack, Queue )

pupu91 2022. 9. 4. 15:29
반응형
반응형

List

: 자료들을 순차적으로 나열한 자료구조
인덱스로 관리
중복해서 객체 저장 가능

구현 클래스

: ArrayList, Vector, LinkedList


 

List 계열 주요 매소드




ArrayList

: 가장 많이 사용되는 컬렉션 클래스
내부적으로 배열을 이용하여 요소를 관리하고, 인덱스를 이용해 배열 요소에 접근 가능
배열의 단점을 보완하기 위해 만들어짐


 

배열의 장점

- 구조가 간단하고 데이터를 읽는 데 걸리는 시간이 짧음(접근시간, access time)

배열의 단점

- 한번 크기를 지정하면 변경할 수 없음
- 요소의 추가/삭제/정렬 등을 하려면 시간이 많이 걸리고 알고리즘이 복잡해짐
- 한 타입의 데이터만 저장가능

ArrayList 특징

- 저장하는 크기의 제약이 없음
- 추가, 삭제, 정렬등의 기능 처리가 간단하게 해결 (복잡한 알고리즘 불필요)
- 여러 타입의 데이터 저장 가능 (기본타입은 저장 할 수 없어 오토박싱되서 객체로 저장 됨)

ArrayList 생성

: 생성시 내부적으로 10칸짜리 배열을 생성해서 관리함.
레퍼런스 타입을 List로 해두면 더 유연한 코드를 작성 할 수 있음.
제네릭 타입을 지정하면 지정한 타입 외의 인스턴스는 저장하지 못함.

List<타입설정>list = new ArrayList();
다형성을 적용하여 생성된 객체의 주소 값을 상위 타입의 레퍼런스 변수가 취급하도록 만든다.

 

 

ArrayList 메소드

메서드 설명
ArrayList() 크기가 10인 ArrayList를 생성
ArrayList(Collection c) 주어진 컬렉션이 저장된 ArrayList를 생성
ArrayList(int initialCapacity) 지정된 초기용량을 갖는 ArrayList를 생성
boolean add(Object o) ArrayList의 마지막에 객체를 추가. 성공하면 true
void add(int index, Object element) 지정된 위치(index)에 객체를 저장
boolean addAll(Collection c) 주어진 컬렉션의 모든 객체를 저장
boolean addAll(int index, Collection c) 지정된 위치부터 주어진 컬렉션의 모든 객체를 저장
void clear() ArrayList를 완전히 비움
Object clone() ArrayList를 복제
boolean contains(Object o) 지정된 객체(o)가 ArrayList에 포함되어 있는지를 확인
void ensureCapacity(int minCapacity) ArrayList의 용량이 최소한 minCapacity가 되도록 함
Object get(int index) 지정된 위치(index)에 저장된 객체를 반환
int indexOf(Object o) 지정된 객체가 저장된 위치를 찾아 반환
boolean isEmpty ArrayList가 비어있는지 확인
iterator iterator() ArrayList의 iterator객체를 반환
int lastIndexOf(Object o) 객체(o)가 저장된 위치를 끝부터 역방향으로 검색해서 반환
ListIterator listIterator() ArrayList의 ListIterator를 반환
ListIterator listIterator(int index) ArrayList의 지정된 위치부터 시작하는 ListIterator 반환
Object remove(int index) 지정된 위치(index)에 있는 객체를 제거
boolean remove(Object o) 지정한 객체를 제거함(성공하면 true, 실패하면 false)
boolean removeAll(Collection c) 지정한 컬렉션에 저장된 것과
동일한 객체들을 ArrayList에서 제거
boolean retainAll(Collectin c) ArrayList에 저장된 객체 중에서
주어진 컬렉션과 공통된 것들만을 남기고 나머지는 삭제
Object set(int index, Object element) 주어진 객체(element)를 지정된 위치(index)에 저장
int size() ArrayList에 저장된 객체의 개수를 반환
void sort(Comparator c) 지정된 정렬기준(c)으로 ArrayList 정렬
List subList(int fromIndex, int tolndex) fromIndex부터 toIndex사이에 저장된 객체를 반환
Object[] toArray() ArrayList에 저장된 모든 객체들을 객체배열로 반환
Object[] toArray(Object[]a) ArrayList에 저장된 모든 객체들을 객체배열 a에 담아 반환
void trimTosize() 용량을 크기에 맞게 줄임(빈 공간을 없앤다)




LinkedList

: ArrayLost가 배열을 이용해서 발생할 수 있는 성능적인 단점을 보완
내부는 이중 연결 리스트로 구현 되어있음



단일 연결 리스트
: 저장한 요소가 순서를 유지하지 않고 저장 되지만 이러한 요소들 사이를 링크로 연결하여 구성
요소의 저장과 삭제 시 다음 요소를 가리키는 참조 링크만 변경하면 되기 때문에 요소의 저장과 삭제가 빈번히 일어나는 경우 ArrayList보다 성능 면에서 우수함. 하지만 단일연결 리스트는 다음 요소만 링크하기 때문에 이전 요소로 접근하기 어려움

이중 연결 리스트
: 단일 연결 리스트는 다음 요소만 링크하는 반면 이중 연결 리스트는 이전 요소도 링크하여 이전 요소로 접근하기 쉽게 고 안 된 자료 구조

LinkedList 생성

List<String> linkedList = new LinkedList<>();




Stack

: Vector 클래스를 상속 받아 구현
스택 메모리 구조는 선현 메모리 공간에 데이터를 저장하며 후입 선출 방식의 자료구조라 부름

 


 

Stack 인스턴스 생성

Stack<Integer> integerStack = new Stack<>();

 

push()

: Stack에 값을 넣을 때 사용하는 메소드
add()도 사용 가능하지만 Vector의 메소드이므로 push()를 사용하는 것이 좋음


serch()

: Stack에 요소를 찾을 때 사용하는 메소드
인덱스가 아닌 위에서부터의 순번을 의미
가장 상단의 위치가 0이 아닌 1부터 시작

public static void main(String[] args) {

	Stack<Integer> integerStack = new Stack<>();
    
    	integerStack.push(1);
		integerStack.push(2);
		integerStack.push(3);
		integerStack.push(4);
		integerStack.push(5);
        
        System.out.println(integerStack.search(5));
		System.out.println(integerStack.search(4));
		System.out.println(integerStack.search(1));  
}
출력 결과
1
2
5



peek()

: 해당 스택의 가장 마지막에(상단에 있는) 요소 반환

System.out.println("peek() : " + integerStack.peek());
System.out.println(integerStack);

출력 결과
peek() : 5
[1, 2, 3, 4, 5] 
=> 요소 보여주고 제거x



pop()

: 해당 스택의 가장 마지막에(상단에 있는) 요소 반환 수 제거
pop은 꺼내면서 요소를 제거하기 때문에 스택이 비어있는 경우 에러 발생

System.out.println("pop() : " + integerStack.pop());
System.out.println(integerStack);

출력 결과
pop() : 5
[1, 2, 3, 4]
=> 요소 보여주고 제거됨




Queue

: 선형 메모리 공간에 데이터를 저장하는 선입선출 방식의 자료 구조
queue 인터페이스를 상속 받는 하위 인터페이스들은
Deque, blockingQueue, TransferQueue 등 다양하지만
대부분의 큐 는 LinkedList를 이용


Queue 생성

:Queue는 인터페이스이기 때문에 인스턴스 생성이 불가하여 LinkedList로 생성해야 함

Queue<String> que = new LinkedList<>();

 

ofrr()

: Queue 데이터를 넣을 때 사용하는 메소드

que.offer("first");
que.offer("second");
que.offer("third");
que.offer("fourth");
que.offer("fifth");
System.out.println(que);
출력결과
[first, second, third, fourth, fifth]



peek()

: 해당 큐의 가장 앞에 있는 요소(먼저 들어온 요소)를 반환

System.out.println("peek() : " + que.peek());
System.out.println(que);
출력 결과
peek() : first
[first, second, third, fourth, fifth]

 

 

poll()

: 해당 큐의 가장 앞에 있는 요소(먼저 들어온 요소)를 반환하고 제거
더이상 반환 값이 없는 경우에는 null 값으로 반환

System.out.println("poll() : " + que.poll());
System.out.println(que);

출력 결과
poll() : first
[second, third, fourth, fifth]
반응형