-
[자료구조] 2-1. 리스트(List) - ArrayListCS/자료구조 2022. 9. 10. 00:18반응형728x90
배열과 리스트의 차이점
배열과 리스트의 가장 큰 차이점은 크기가 고정되어있냐, 동적이냐로 볼 수 있다.
배열은 크기가 고정되어 있는 반면, 리스트는 크기가 정해져있지 않고 동적으로 변한다.
또한 배열은 식별자인 index가 존재하고 리스트는 존재하지 않는다.
리스트는 인터페이스이다.
이 리스트를 구현한 자료형으로 ArrayList, LinkedList 등이 있다.
그 중에서 ArrayList는 배열(index)과 리스트(가변 길이)의 장점을 합친 자료구조이다.
이미지 출처: https://greatzzo.tistory.com/43 위 이미지와 같은 구조이기 때문에 ArrayList를 선언할 때 List로 변수를 선언할 수도 있다.
ArrayList 선언과 해당 메소드
- ArrayList<Integer> arrayList = new ArrayList<>();
- add(obj) / add(idx, obj)
- size()
- get(idx)
- remove(idx) / remove(obj)
- contains(obj)
- sort(Comparator.naturalOrder())
- sort(Comparator.reverseOrder())
- Arrays.asList(arr)
- str.substring(start idx, end idx)
- String.join("구분자", interable obj)import java.util.ArrayList; import java.util.List; public class ArrayListExample { public static void main(String[] args) { // ArrayList 선언 방법1 List<Integer> arrayList = new ArrayList<Integer>(); // ArrayList 선언 방법2 ArrayList<Integer> arrayList2 = new ArrayList<Integer>(); } }
cf) 방법1처럼 선언할 경우, arrayList를 사용하다가 LinkedList로 바꿔 사용할 수도 있다.
import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class ArrayListExample { public static void main(String[] args) { // ArrayList 선언 방법1 List<Integer> arrayList = new ArrayList<Integer>(); arrayList = new LinkedList<Integer>(); // ArrayList 선언 방법2 ArrayList<Integer> arrayList2 = new ArrayList<Integer>(); } }
JDK 1.7이상부터는 인스턴스 생성 시 타입 추정이 가능한 경우 타입을 생략할 수 있다.
따라서 아래처럼 선언할 수도 있다.
// ArrayList 선언 방법3 ArrayList<Integer> arrayList3 = new ArrayList<>();
이때 기억해야할 사항으로, List는 타입 선언 시 primitive type은 불가능하다.
따라서 Wrapper Class로 타입을 선언한다(ex) int (x) -> Integer(o)).
ArrayList에 값을 추가할 때에는 add 메소드를 사용한다.
배열(Array)와 다르게 ArrayList의 크기를 알고 싶을 때에는 size 메소드를 사용한다(배열의 경우, length).
값을 읽을 때에는 get 메소드와 index를 사용한다.
// 값 추가 arrayList.add(100); arrayList.add(200); arrayList.add(300); // ArrayList 크기 확인(즉, 배열 길이 확인) System.out.println(arrayList.size()); // 3 // index로 값 읽기 System.out.println(arrayList.get(1)); // 200
값을 변경하고 싶을 때에는 set 메소드를 사용한다.
// 값 변경: set(idx, value) arrayList.set(1, 500); // idx로 값 읽기 System.out.println(arrayList.get(1)); // 500
값을 삭제하고 싶을 때에는 remove 메소드를 사용한다.
이때 해당 idx 위치의 값이 삭제되고 뒤에 있는 값들이 앞으로 당겨진다.
// 값 삭제: remove(idx) arrayList.remove(0); // ArrayList 크기 확인(즉, 배열 길이 확인) System.out.println(arrayList.size()); // 2 // idx로 값 읽기 System.out.println(arrayList.get(0)); // 500 System.out.println(arrayList.get(1)); // 300
cf) arrayList.remove(0)이 실행되기 전 arrayList의 0번째 idx에는 100이 들어있었다.
위에서 말했던 add 메소드로 배열(ArrayList) 사이에 값을 추가할 수도 있다.
// 배열(ArrayList) 사이에 값 추가하기 arrayList.add(1, 1000); // ArrayList 크기 확인(즉, 배열 길이 확인) System.out.println(arrayList.size()); // 3 // idx로 값 읽기 System.out.println(arrayList.get(0)); // 500 System.out.println(arrayList.get(1)); // 1000 System.out.println(arrayList.get(2)); // 300
contains 메소드를 사용하면 해당 값을 ArrayList가 갖고 있는 지 확인해 볼 수 있다.
이때 리턴타입은 boolean이다.
// 해당 값을 갖고 있는 지 확인 System.out.println(arrayList.contains(1000)); // true
추가로 앞서 말했던 remove 메소드의 경우 사용법이 두가지이다.
1. remove(idx)
2. remove(obj)
ArrayList 타입이 Integer가 아닐 경우 2번의 방법도 사용가능하다.
// 값 삭제: remove(idx) / remove(obj) ArrayList<String> stringArrayList = new ArrayList<String>(); stringArrayList.add("월"); stringArrayList.add("화"); stringArrayList.add("수"); stringArrayList.add("목"); stringArrayList.add("금"); stringArrayList.add("토"); stringArrayList.add("일"); System.out.println(stringArrayList.size()); // 7 // remove(obj)의 경우 리턴타입 boolean System.out.println(stringArrayList.remove("요일")); // false System.out.println(stringArrayList.remove("월")); // true stringArrayList.remove(5); System.out.println(stringArrayList.size()); // 5
이미 데이터가 존재할 경우 ArrayList로 생성
- Arrays.asList()를 사용한다.
import java.util.ArrayList; import java.util.Arrays; public class ArrayListExample2 { public static void main(String[] args) { String[] weeks = {"월", "화", "수", "목", "금", "토", "일"}; ArrayList<String> arrayList = new ArrayList<>(Arrays.asList(weeks)); System.out.println(arrayList); // [월, 화, 수, 목, 금, 토, 일] ArrayList<String> arrayList2 = new ArrayList<>(Arrays.asList("월", "화", "수", "목", "금", "토", "일")); System.out.println(arrayList2); // [월, 화, 수, 목, 금, 토, 일] } }
※ cf) [월, 화, 수, 목, 금, 토, 일]이 아닌 "월, 화, 수, 목, 금, 토, 일" 형태로 출력하기
import java.util.ArrayList; import java.util.Arrays; public class ArrayListExample2 { public static void main(String[] args) { String[] weeks = {"월", "화", "수", "목", "금", "토", "일"}; ArrayList<String> arrayList = new ArrayList<>(Arrays.asList(weeks)); System.out.println(arrayList); // [월, 화, 수, 목, 금, 토, 일] // [월, 화, 수, 목, 금, 토, 일]이 아닌 "월, 화, 수, 목, 금, 토, 일" 형태로 출력하기 String result = ""; for (int i = 0; i < arrayList.size(); i++) { result += arrayList.get(i); result += ", "; // ", "를 추가한다. } result = result.substring(0, result.length() - 2); // 마지막 ", "는 제거한다. System.out.println(result); // 월, 화, 수, 목, 금, 토, 일 } }
String.join을 사용하면 더 쉽게 처리할 수 있다.
String result2 = String.join(", ", arrayList); System.out.println(result2); // 월, 화, 수, 목, 금, 토, 일
이는 배열(Array)에서도 동일하게 사용할 수 있다.
String[] weeks = {"월", "화", "수", "목", "금", "토", "일"}; String result = String.join(", ", weeks); System.out.println(result); // 월, 화, 수, 목, 금, 토, 일
Comparator 클래스를 이용한 정렬
※ cf) 리스트의 sort 메소드는 Java 8 버전부터 사용할 수 있다.
import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; public class ArrayListExample2 { public static void main(String[] args) { ArrayList<String> fruits = new ArrayList<>(Arrays.asList("banana", "apple", "tomato")); fruits.sort(Comparator.naturalOrder()); // 오름차순으로 정렬 System.out.println(fruits); // [apple, banana, tomato] fruits.sort(Comparator.reverseOrder()); // 내림차순 정렬 System.out.println(fruits); // [tomato, banana, apple] } }
참고 및 출처: https://wikidocs.net/207
728x90'CS > 자료구조' 카테고리의 다른 글
[자료구조] 5. 해시(Hash) - HashMap (2) 2022.10.03 [자료구조] 2-2 리스트(List) - Linked List, Doubly Linked List (0) 2022.10.01 [자료구조] 4. 스택(Stack) (0) 2022.09.11 [자료구조] 3-1. 큐(Queue) (0) 2022.09.10 [자료구조] 1. 배열(Array) (0) 2022.09.09