안녕하세요 코이킹입니다.
이번 포스트에서는 리스트에 대해서 설명해보겠습니다.
1. 리스트(List)란?
리스트는 자바에서 자료구조와 데이터를 처리하는 컬렉션 프레임워크에 속한 인터페이스입니다.
배열처럼 순서가 있는 데이터를 저장하기위한 자료구조로
리스트를 구현한 클래스로는 ArrayList, LinkedList, Vector 등이 있습니다.
2. ArrayList
1) ArrayList란
'ArrayList는 크기가 변할 수 있는 배열'과 같은 자료구조 입니다.
ArrayList의 클래스 내부를 보면 배열을 사용해서 데이터를 저장하는 것을 알 수 있습니다.
※ 장점
- 배열처럼 인덱스를 사용하여 빠르게 요소에 접근이 가능합니다.
※ 단점
- 리스트의 길이가 변할때 처리시간이 오래 걸립니다.
: 리스트에 데이터를 넣다 보면 리스트 내부의 데이터를 저장하는 배열의 길이를 초과하는 경우가 발생.
이때 길이를 늘린 새로운 배열에 저장된 배열의 데이터를 복사하는 처리가 일어남(네이티브 코드).
이 처리가 오래걸릴 수 있음.
- 리스트의 각 요소의 삭제처리 시간이 오래 걸립니다.
※ 주로 사용되는 곳
- 리스트에 저장될 데이터의 양이 일관되며, 데이터의 입력・삭제가 적은 곳
- 데이터의 접근 속도가 빨라야하는 곳
2) 데이터의 삽입
add메서드를 사용하여 데이터를 리스트에 넣을 수 있습니다.
List<String> list = new ArrayList<String>();
list.add("ArrayList-String01"); // Index 0
list.add("ArrayList-String02"); // Index 1
list.add("ArrayList-String03"); // Index 2
list.add("ArrayList-String04"); // Index 3
list.add("ArrayList-String05"); // Index 4
3) 데이터 출력
- Index를 지정해서 출력 :
get메서드에 인덱스번호를 파라미터로 넘겨서, 데이터에 접근・출력할 수 있습니다.
System.out.println("Index 2번의 데이터 출력 : "+ list.get(2));
- 전체 데이터 출력 (for-each) :
향상된 for문을 사용하면 간단히 전체 데이터를 출력할 수 있습니다.
for (String str : list) {
System.out.println("Using for-each : "+str);
}
- 전체 데이터 출력 (for문과 인덱스)
for문과 인덱스 번호 , get메서드를 사용하여 전체 데이터를 출력할 수 있습니다.
// ※ size메서드로 리스트의 길이를 알 수 있음.
for (int i=0; i<list.size(); i++) {
System.out.println("Using for Index ["+i+"] : "+list.get(i));
}
- 전체 데이터 출력 (forEach메서드)
forEach메서드를 사용하면 간단히 전체 데이터를 출력할 수 있습니다.
list.forEach(str -> {
System.out.println("Using forEach() : "+str);
});
4) 데이터 갱신
set메서드에 인덱스 번호와 갱신할 데이터를 파라미터롤 넘겨서, 데이터를 갱신할 수 있습니다.
list.set(1, "ArrayList-String020202"); // set메서드사용; Index를 지정하여 데이터 갱신을 할수 있음.
printList(list);
5) 데이터 삭제
- 인덱스 번호를 지정해서 삭제
list.remove(1); // Index를 지정해서 삭제
printList(list);
- 값을 찾아서 삭제
list.remove(list.get(2)); // 값을 찾아서 삭제
printList(list);
- 모든 요소를 삭제
list.clear(); // 모든 요소 삭제
printList(list);
3. LinkedList
1) LinkedList란?
링크드 리스트는 데이터 저장을 배열이 아닌 '노드'를 사용하여 구현한 자료구조로
노드와 노드가 서로 연결되어 있는 형태로 데이터를 저장합니다.
※ 노드(Node)란?
이전 노드의 참조값과 다음 노드의 참조값 저장해야 하는 데이터를 담고 있는 객체입니다.
※ 장점
- 데이터의 입력과 삭제가 빠릅니다.
※ 단점
- 데이터의 검색속도가 느립니다.
※ 사용처
- 데이터의 접근・검색보다 입력과 삭제가 많을 경우 사용합니다.
※ 데이터의 입력,출력,갱신,삭제는 ArrayList와 같은 메서드를 사용하므로 생략합니다.
4. Vector
1) Vector란?
Vector는 ArrayList처럼 길이가 변하는 배열과 같은 자료구조 입니다.
성능 자체가 ArrayList가 더 좋기에 Vector는 거의 사용되지 않습니다.
ArrayList와의 차이는 Vector의 경우 Thread-safe 하며, ArrayList는 그렇지 않으므로 코드를 Thread-safe 하게 작성해야 할 경우에 사용됩니다만,
현재는 ArrayList를 생성시 synchronizedList()를 매개변수로 하여 생성하면
ArrayList로도 Thread-safe한 ArrayList가 생성 가능하므로
※ 예시 : ArrayList arrayList = new ArrayList<>(Collections.synchronizedList(list));
써야 하는 이유는 딱히 없지만, 레거시 코드에 사용되어 있을 가능성이 있으므로 이런 게 있구나 하고 알고만 있으면 됩니다.
※ 데이터의 입력,출력,갱신,삭제는 ArrayList와 같은 메서드를 사용하므로 생략합니다.
※ 예제코드
https://github.com/leeyoungseung/algorithmBasic/blob/master/algorithm/src/basic/B_11_List.java
※ qiita에 투고한 URL
'프로그래밍 > Java-문법정리' 카테고리의 다른 글
【Java문법】셋(Set) (0) | 2022.01.10 |
---|---|
【Java문법】맵(Map) (0) | 2022.01.10 |
【Java문법】래퍼클래스 (0) | 2022.01.10 |
【Java문법】표준입출력 (0) | 2022.01.09 |
【Java문법】메서드 (0) | 2022.01.09 |
댓글