반응형
배열과의 차이점
- 배열
- 크기를 미리 알고 있어야 한다. 크기는 고정되어있다.
- 배열에 있는 중간 값을 빼내면 비어있는 채로 유지된다.
- index기반으로 접근이 가능하다.
- 기본자료형(primitive type), 클래스 자료형도 담을 수 있다.
- 리스트
- 크기가 고정되어있지 않고, 동적으로 할당된다.
- 중간 값을 빼내면 앞으로 당겨진다. (메모리 낭비가 없다)
- 여러 방법으로 데이터를 다룰 수 있다
- 클래스 자료형(참조 자료형)만 담을 수 있다. (기본 자료형은 담을 수 없음)
- 타입 안정성을 보장하는 generic을 사용할 수 있다.
List<Integer> numbers = new ArrayList<>();
http://egloos.zum.com/xxwony/v/33456
클래스를 생성할때 도형 타입으로 생성하게 되면 정사각형이 아닌 다른 직사각형, 삼각형등 도형 인터페이스를 구현한 클래스에서 사용 될 수 있다. 그렇지만 정사각형 클래스로 생성하게 되면 직사각형, 삼각형등에서는 사용할 수 없게 된다.
ArrayList
일반적인 배열처럼 사용하므로 배열과 유사하다.
※ 일반 배열과 ArrayList는 인덱스로 객체를 관리한다는 점에서 동일하지만, 크기를 동적으로 늘릴 수 있다는 점에서 차이점이 있다.
내부적으로는 데이터를 배열에서 관리한다.
많은 양의 데이터를 추가/삭제 하는 경우 느리다.
index로 접근하므로 검색 속도는 빠르다.
LinkedList
리스트의 수정이 많을 때 사용한다.
기차처럼 Node로 연결되어 있으며 각 노드는 다음 노드가 무엇인지 가리킨다.
검색 시 속도가 느리다 (모든 요소를 탐색해야 하기 때문)
※ ArrayList에는 내부 배열에 객체를 저장해서 인덱스로 관리하지만, LinkedList는 인접 참조를 링크해서 체인처럼 관리한다.
Vector
ArrayList와 동일한 내부 구조를 가지고 있다.
ArrayList와 차이점으로는 Vector 클래스는 동기화된(synchronized) 메서드로 구성되어 있다. 그렇기 때문에 멀티 스레드 환경에서 안전하게 객체를 추가, 삭제할 수 있다.
즉, 스레드에 안전하다(Thread Safe)라고 말할 수 있다.
List의 메소드
메소드명 | 설명 | 반환값 |
toString() | 리스트 값을 [값, 값...]의 문자열 형태로 돌려준다. | String |
add(값) | 값을 추가한다 | boolean: add가 성공했는지 여부 |
addAll(콜렉션) | Collection을 통째로 추가한다. | boolean: add가 성공했는지 여부 |
contains(값) | 리스트에 값이 들어있는지 확인 | boolean: 들어있는지 여부 |
remove(index) | index 위치의 요소를 삭제한다. | Object(제네릭 설정된 타입): 삭제된 값 |
remove(값) | (값이 숫자가 아닌 경우)값으로 삭제한다. | boolean: 삭제가 됐는지 여부 |
clear() | 모든 요소 삭제 | void |
set(index, 값) | index 위치의 값을 변경한다. | Object(제네릭 설정된 타입)기존에 있던 값 |
sort(Comparator.naturalOrder()) | 오름차순으로 정렬 | void |
sort(Comparator.reverseOrder()) | 내림차순으로 정렬 | void |
isEmpty() | 리스트가 비어있는지 확인 | boolean: 비었는지 여부 |
size() | 리스트의 크기 | int: 리스트의 크기 |
List를 출력하는 3가지 방법
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ex02 {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>();
fruits.add("apple");
fruits.add("banana");
fruits.add("mango");
// 1. 인덱스 기반으로 출력
for (int i = 0; i < fruits.size(); i++) {
System.out.println(fruits.get(i)); // 배열의 [i] => .get(i)메소드 사용
// 만약에 b로 시작하는 과일은 제거
if (fruits.get(i).startsWith("b")) {
fruits.remove(i);
i--; // 삭제가 될 때 한번 더 돌리기 위해 i--; 시킨다.
}
}
// 2. Iterator 사용하기
Iterator<String> iter = fruits.iterator();
while (iter.hasNext()) {
String fruit = iter.next(); // next() 호출할 때마다 소비가 되므로 반복문에서 한번만 수행하는게 좋다.
System.out.println(fruit);
// b로 시작하는 과일 제거
if (fruit.startsWith("b")) {
iter.remove(); // 리스트에서 직접 삭제하지 않고 iterator의 remove로 삭제해야한다.
}
}
System.out.println(fruits);
// 3. 향상된 for문
// money in pocket
for (String fruit : fruits) {
System.out.println(fruit);
if (fruit.startsWith("b")) { // 자바 버전마다 동작이 다르기 때문에 중간에 절대 삭제하지 말 것.
fruits.remove(fruit);
}
}
}
}
반응형
'Study > JAVA' 카테고리의 다른 글
[Java] 컬렉션 (Collection) - Map (0) | 2021.11.23 |
---|---|
[JAVA] 컬렉션(Collection) - Set (0) | 2021.11.23 |
[JAVA] 객체지향 언어의 특징 정리 (0) | 2021.11.15 |
[JAVA] 추상클래스(Abstract class), 인터페이스(Interface) (0) | 2021.11.15 |
[JAVA] 정보의 은닉화(캡슐화), Getter와 setter (0) | 2021.11.10 |