List(리스트)도 Collection(컬렉션)을 상속받고 있습니다.
이전 포스팅에서 보았던 Vector(백터)의 경우 컬렉션을 상속받고 있는 리스트를 상속받고 있습니다.
백터가 값의 순서가 있으며 중복을 허용했었던 것처럼 리스트도 값의 순서가 있고 중복을 허용하고 있습니다.
또한 대표적인 List를 상속받고 있는 컬렉션 클래스는 다음과 같습니다.
1. ArrayList<E>
2. LinkedList<E>
3. Vector<E>
4. Stack<E>
리스트를 상속받고 있는 모든 컬렉션 클래스는 값의 저장 순서가 유지되며 중복을 허용합니다.
일반적으로 위 4개의 컬렉션 중 ArrayList를 가장 많이 쓰고 지난번 포스팅에서 백터를 보았기 때문에 ArrayList를 알아보고 LinkedList 컬렉션을 간단하게 알아보겠습니다.
1. ArrayList<E>
ArrayList는 내부적으로 배열을 이용하여 값을 저장합니다.
배열을 이용하기 때문에 index를 이용해 배열 값에 빠른 접근이 가능합니다.
하지만 배열은 크기를 변경할 수 없고 만약 크기를 늘리고자 한다면 새로운 배열을 만들어서 기존의 값들을 옮겨야 하는 과정을 거쳐야 합니다.
요소의 추가 및 삭제 작업에 걸리는 시간이 매우 길어지는 단점을 가지게 됩니다.
package com.test01;
import java.util.*;
public class MTest01 {
public static void main(String[] args) {
ArrayList<Integer> arrList = new ArrayList<Integer>();
// add() 메소드를 이용한 요소의 저장
arrList.add(40);
arrList.add(20);
arrList.add(30);
arrList.add(10);
// for 문과 get() 메소드를 이용한 요소의 출력
System.out.print("arrList에 들어 있는 값 : ");
for (int i = 0; i < arrList.size(); i++) {
System.out.print(arrList.get(i) + " ");
}
System.out.println();
// remove() 메소드를 이용한 요소의 제거
arrList.remove(1);
// Enhanced for 문과 get() 메소드를 이용한 요소의 출력
System.out.print("1번째 값이 제거된 후 남은 값 : ");
for (int e : arrList) {
System.out.print(e + " ");
}
System.out.println();
// Collections.sort() 메소드를 이용한 요소의 정렬
Collections.sort(arrList);
// iterator() 메소드와 get() 메소드를 이용한 요소의 출력
System.out.print("정렬된 후 의 arrList : ")l
Iterator<Integer> iter = arrList.iterator();
while (iter.hasNext()) {
System.out.print(iter.next() + " ");
}
System.out.println();
// set() 메소드를 이용한 요소의 변경
arrList.set(0, 20);
System.out.print("0번 값이 변경 된 후 arrList : ");
for (int e : arrList) {
System.out.print(e + " ");
}
System.out.println();
// size() 메소드를 이용한 요소의 총 개수
System.out.println("리스트의 크기 : " + arrList.size());
}
}
2. LinkedList<E> 클래스
LinkedList는 ArrayList가 배열을 이용하여 값을 저장함으로 생기는 단점을 보완할 수 있습니다.
LinkedList는 내부적으로 연결 리스트(linked list)를 이용하여 값을 저장합니다.
배열은 저장된 값이 순차적으로 저장됩니다.
하지만 연결 리스트는 저장된 요소가 비순차적으로 분포되며, 이러한 요소들 사이를 링크(link)로 연결하여 구성합니다.
다음 요소를 가리키는 참조만을 가지는 연결 리스트를 단일 연결 리스트(singly linked list)라고 합니다.
이러한 단일 연결 리스트는 요소의 저장과 삭제 작업이 다음 요소를 가리키는 참조만 변경하면 되므로, 아주 빠르게 처리될 수 있습니다.
하지만 단일 연결 리스트는 현재 요소에서 이전 요소로 접근하기가 매우 어렵습니다.
따라서 이전 요소를 가리키는 참조도 가지는 이중 연결 리스트(doubly linked list)가 좀 더 많이 사용됩니다.
LinkedList 클래스도 위와 같은 이중 연결 리스트를 내부적으로 구현한 것입니다.
LinkedList 클래스 역시 List를 상속받고 있으므로, ArrayList 클래스와 사용할 수 있는 메소드가 거의 같습니다.
package com.test01;
import java.util.*;
public class MTest01 {
public static void main(String[] args) {
LinkedList<String> lnkList = new LinkedList<String>();
// add() 메소드를 이용한 요소의 저장
lnkList.add("넷");
lnkList.add("둘");
lnkList.add("셋");
lnkList.add("하나");
// for 문과 get() 메소드를 이용한 요소의 출력
System.out.print("LinkedList에 저장된 값 : ");
for (int i = 0; i < lnkList.size(); i++) {
System.out.print(lnkList.get(i) + " ");
}
System.out.println();
// remove() 메소드를 이용한 요소의 제거
lnkList.remove(1);
System.out.print("1번째 값 제거 후 : ");
// Enhanced for 문과 get() 메소드를 이용한 요소의 출력
for (String e : lnkList) {
System.out.print(e + " ");
}
System.out.println();
// set() 메소드를 이용한 요소의 변경
lnkList.set(2, "둘");
System.out.print("2번째 값 변경 후 : ");
for (String e : lnkList) {
System.out.print(e + " ");
}
System.out.println();
// size() 메소드를 이용한 요소의 총 개수
System.out.println("리스트의 크기 : " + lnkList.size());
}
}
package com.test01;
import java.util.ArrayList;
import java.util.List;
public class MTest01 {
// List 순서 O / 중복 O
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("홍길동");
list.add("이순신");
list.add("김선달");
list.add("강호동");
list.add("유재석");
list.add("조세호");
list.add("신동엽");
list.add("조세호"); //중복가능
transElement(list);
}
private static void transElement(List<String> list) {
// 1. "홍길동"의 인덱스를 찾아서 해당 인덱스의 값을 "김길동"으로 바꾸자.
list.set(list.indexOf("홍길동"), "김길동");
prn(list);
// 2. "~신"으로 끝나는 객체를 찾아서, 만일 있으면 "~자"로 바꾸자.
for (int i = 0; i < list.size(); i++) {
if(list.get(i).endsWith("신")){
list.set(i, list.get(i).replace("신", "자"));
}
}
prn(list);
// 3. 끝 글자가 "호"인 이름을 찾아서 삭제하자.
for (int i = 0; i < list.size(); i++) {
if(list.get(i).endsWith("호")){
list.remove(list.get(i));
}
}
prn(list);
}
private static void prn(List<String> list) {
for(String s : list) {
System.out.print(s + " ");
}
System.out.println();
}
}
'Java 관련 > Java' 카테고리의 다른 글
[Java] Map Collection(맵) (0) | 2021.11.15 |
---|---|
[Java] Set Collection(셋 컬렉션) (0) | 2021.11.14 |
[Java] 백터(Vector) & 향상된 for문(foreach) (0) | 2021.11.12 |
[Java] 컬렉션(Collection framework) (0) | 2021.11.11 |
[Java] 제네릭(Generic) (0) | 2021.11.10 |