자료구조

[JAVA/자료구조] List컬렉션 클래스 - ArrayList, LinkedList, Vector, Stack

닥스훈스 2019. 6. 8. 18:43

List 인터페이스

List인터페이스는 중복을 허용하면서 저장 순서가 유지되는 컬렉션을 구현하는데 사용된다.
대표적인 List컬렉션 클래스에 속하는 클래스 4가지는 다음과 같다.

 

List인터페이스에 정의된 메서드

 

1. Vector클래스

Vector클래스는 JDK1.0부터 사용해 온 ArrayList와 같은 동작을 수행하는 클래스이다.
하지만 기존 코드와의 호환성을 위해서만 남아있으므로 Vector클래스보다는 ArrayList클래스를 사용하는것이 좋다.

 

2. ArrayList클래스

ArrayList는 기존의 Vector을 개선한 것으로 Vector의 구현원리와 기능적인 측면에서 동일하다고 할 수 있다.
ArrayList는 Obeject배열을 이용해서 구현하여 인덱스를 이용해서 데이터에 접근한다. 데이터를 조회할 땐 빠르지만, 데이터를 추가/삭제할 경우 느리다.

생성

ArrayList를 사용하려면 먼저 ArrayList객체를 만든다. 

import java.util.ArrayList;

ArrayList<Integer> numbers = new ArrayList<>();

추가

엘리먼트에 추가할 때는 add메소드를 사용한다. add는 단순히 배열 뒤에 데이터를 추가하기 때문에 빠르다.

numbers.add(10);
numbers.add(20);
numbers.add(30);
numbers.add(40);

삭제

특정 인덱스에 위치한 엘리먼트를 삭제할 때는 remove를 사용한다.

numbers.remove(2);

가져오기

특정 인덱스에 위치한 엘리먼트를 가져올 때는 get을 사용한다. 이때 내부에서 배열을 사용하므로 속도가 매우 빠르다.

numbers.get(2);

반복

ArrayList를 탐색할 때 Iterator를 쓴다. 

Iterator이란?
자바의 컬렉션 프레임워크에서 컬렉션에 저장되어 있는 요소들을 읽어오는 방법중 하나

Iterator를 사용하려면 먼저 iterator객체를 생성해야 한다.

Iterator it<Integer> = numbers.iterator();

Iterator객체를 사용하면 List객체에 저장된 값을 하나씩 순회할 수 있다.

while(it.hasNext()){
	int value=it.next();
    if(value==30){
    it.remove();
    }
}

it.next() 메소드는 호출될 때 마다 엘리먼트를 순서대로 리턴한다. 만약 더이상 순회할 엘리멘트가 없다면 fasle를 리ㄴ턴해 while문은 종료된다. Iteraotr는 remove()함수로 엘리먼트를 삭제하고 또는 추가할 수도 있다.
다음은 Iterator를 사용하지 않고 편리하게 엘리먼틀르 순회하는 방법이다.

for(int value : numbers){
	System.out.println(value);
}

예제

import java.util.ArrayList;
import java.util.Iterator;

public class ArrayList2 {

	public static void main(String[] args) {

		ArrayList<Integer> numbers = new ArrayList<Integer>();

		numbers.add(10);
		numbers.add(20);
		numbers.add(30);
		numbers.add(40);
		System.out.println("add(값)");
		System.out.println(numbers);

		numbers.add(1, 50);
		System.out.println("\nadd(인덱스, 값)");
		System.out.println(numbers);

		numbers.remove(2);
		System.out.println("\nremove(인덱스)");
		System.out.println(numbers);

		System.out.println("\nget(인덱스)");
		System.out.println(numbers.get(2));

		System.out.println("\nsize()");
		System.out.println(numbers.size());

		System.out.println("\nindexOf()");
		System.out.println(numbers.indexOf(30));

		Iterator it = numbers.iterator();
		System.out.println("\niterator");
		while (it.hasNext()) {
			int value = (int) it.next();
			if (value == 30) {
				it.remove();
			}
			System.out.println(value);
		}
		System.out.println(numbers);

		System.out.println("\nfor each");
		for (int value : numbers) {
			System.out.println(value);
		}
		System.out.println("\nfor");
		for (int i = 0; i < numbers.size(); i++) {
			System.out.println(numbers.get(i));
		}

	}

}

 

3. LinkedList클래스

LinkedList(연결리스트=링크드리스트)는 ArrayList클래스가 배열을 이용하여 요소를 저장하므로써 발생하는 다음 단점을 극복하기 위해 고안되었다.

배열의 단점
1. 크기를 변경할 수 없다.
2. 비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다.

배열은 모든 데이터가 연속적으로 존재하지만 연결리스트는 불연속적으로 존재하는 데이터를 서로 연결(link)한 형태로 구성되어 있다. 연결리스트역시 List인터페이스를 구현하므로, ArrayList와 사용할 수 있는 메소드가 거의 같다. 연결리스트에는 다음과 같은 3가지 연결 리스트가 있다.

  • 단순 연결 리스트(Singly linked list): 하나의 방향으로만 연결되어 있다. 맨 마지막 노드의 링크필드는 NULL값을 가진다.
  • 원형 연결 리스트(Circular linked list): 단순 연결 리스트와 같으나 맨 마지막 노드의 링크값이 첫 번째 노드를 가리킨다는 것만 다르다.
  • 이중 연결 리스트(Doubly linked list): 각 노드마다 링크 필드가 2개씩 존재한다. 각각의 노드는 앞에 있는 노드를 가리키는 링크와 다음에 있는 노드를 가리키는 링크를 함께 가지고 있다.

LinkedList클래스는 이중 연결 리스트로 구현되어 있는데, 이는 연결 리스트의 단점인 낮은 접근성을 높이기 위한 것이다. 연결리스트의 각 요소들은 위의 그림과 같이 자신과 연결된 다음 요소에 대한 참조(주소값)와 데이터로 구성되어 있다.

생성

import java.util.LinkedList;

LinkedList<String> lnklist = new Linkedlist<String>();

※ 이외, 추가/삭제 등의 함수는 연결리스트와 동일하므로 생략한다.

예제

import java.util.LinkedList;

public class LinkedListTest {
	public static void main(String[] args) {
		LinkedList<String> lnkList = new LinkedList<String>();

		// add() 메소드를 이용한 요소의 저장
		lnkList.add("넷");
		lnkList.add("둘");
		lnkList.add("셋");
		lnkList.add("하나");

		// for 문과 get() 메소드를 이용한 요소의 출력
		for (int i = 0; i < lnkList.size(); i++) {
			System.out.print(lnkList.get(i) + " ");
		}
		System.out.println();

		// remove() 메소드를 이용한 요소의 제거
		lnkList.remove(1);

		// Enhanced for 문과 get() 메소드를 이용한 요소의 출력
		for (String e : lnkList) {
			System.out.print(e + " ");
		}
		System.out.println();

		// set() 메소드를 이용한 요소의 변경
		lnkList.set(2, "둘");

		for (String e : lnkList) {
			System.out.print(e + " ");
		}
		System.out.println();

		// size() 메소드를 이용한 요소의 총 개수
		System.out.println("리스트의 크기 : " + lnkList.size());
	}
}

 

4. Stack

Stack클래스는 List컬렉션 클래스의 Vector클래스를 상속받아, 전형적인 스택 메모리 구조의 클래스를 제공한다.
자세한 설명은 다음 링크를 참고한다.

2019/05/22 - [자료구조] - [JAVA 자료구조] 스택(Stack)

 

[JAVA 자료구조] 스택(Stack)

스택이란? 스택은 물건을 쌓아올리는 자료를 쌓아 올린 형태의 자료구조이다. 가장 먼저 입력된 데이터가 맨 아래에 쌓이고 가장 최근에 입력된 데이터가 가장 위에 쌓이는 구조를 가지고 있다. 스택의 마지막에..

icandooit.tistory.com

 

Reference

http://tcpschool.com/

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

Java의 정석

https://programmers.co.kr/learn/courses/17/lessons/803

 

자바로 배우는 자료구조(with 생활코딩) - 리스트(List)의 개념 | 프로그래머스

리스트(List)의 개념 배열은 데이터를 그룹핑해서 다수의 데이터를 효율적으로 관리하는 데이터 스트럭쳐입니다. 배열의 가장 큰 특징은 인덱스가 있다는 점이지요. 이 인덱스는 데이터를 매우 빠르게 가져옵니다. 하지만 인덱스를 써 데이터를 가져오려면 각 데이터의 인덱스 값이 고정되어야 합니다. 또 어떤 엘리먼트를 삭제하면 삭제된 데이터가 있던 자리는 비워둬야 해 메모리가 낭비됩니다. 또 배열에 데이터가 있는지 없는지 항상 확인해야 합니다. 리스트는 배열의 장

programmers.co.kr