List란
리스트는 배열과 비슷한 자바의 자료형으로 배열보다 편리한 기능을 많이 가지고 있다.
배열은 크기가 정해져 있다. 예를 들어 배열의 크기를 10개로 정했다면 10개 이상의 값을 담을 수는 없다.
박찬호 선수의 투구스피드를 저장해야 한다고 가정해 보자. 배열을 이용하여 투구수를 저장할 수 있을까? 1회에 투구수가 3개도 될 수 있고 100개도 될 수 있지 않은가? 프로그래밍 시 크기를 알 수 있는 상황도 있지만 명확한 크기를 알 수 없는 경우가 더 많다. 이렇게 동적으로 자료형의 갯수가 가변하는 상황이라면 List를 사용하는 것이 유리하다.
List
자료형 중 가장 간단한 형태의 자료형인 ArrayList
에 대해서 알아보자.
ArrayList
- ArrayList 옛날에는 Vector라는 것을 사용하기도 함
- List 인터페이스를 구현하는 클래스이다.
- ArrayList
iList = new ArrayList<>();
- ArrayList
- List
iList = new ArrayList<>(); // 주로 사용
- List
- 배열을 사용하기 쉽게 만들어 놓은 클래스이다.
- 장점 : 순차적인 접근이 빠르다.(검색이 빠르다)
- 단점 : 중간 위치에 요소를 추가(뒤의 값을 뒤로 밀어야하기 때문)하거나 삭제(뒤의 값을 당겨야하기 때문)할 때 느리다.
예시코드
public class Ex01_ArrayList {
public static void main(String[] args) {
ArrayList<Integer> iList = new ArrayList<>();
// 1. 저장 : add() 메소드
iList.add(10);
iList.add(new Integer(20));
iList.add(new Integer("30"));
// 2. 크기 : size() 메소드
System.out.println("iList 크기 : " + iList.size());
// 3. 저장된 요소 가져오기 : get() 메소드
System.out.println("첫 번째 요소 : " + iList.get(0));
System.out.println("마지막 요소 : " + iList.get(iList.size() - 1));
// 4. 전체 순회하는 for문
// method 호출을 여러번 진행함, 성능이 필드 호출보다 안 좋음
// 나쁜 코드
for(int i = 0; i < iList.size(); i++)
System.out.println((i + 1) + "번째 요소 : " + iList.get(i));
System.out.println("-----");
// 5. 개선된 for문 (size() 메소드 호출을 한 번으로 줄임)
// 클린 코드
for(int i = 0, size = iList.size(); i < size; i++)
System.out.println((i + 1) + "번째 요소 : " + iList.get(i));
System.out.println("-----");
// 6. 삭제 : remove 메소드
iList.remove(0); // 첫 번째 요소 삭제(인덱스 0), 삭제 된 값을 return
System.out.println(iList.get(0)); // 삭제된 자리 뒤의 요소들이 앞 당겨져 빈 자리를 메꾼다.
iList.remove(new Integer(20)); // 요소 번호가 아닌 요소의 값을 찾아 삭제, booleand type 으로 return
// 7. 검색 : contains() 메소드
if (iList.contains(new Integer(30))) // iList에 30이 있는가?
System.out.println("30이 있다.");
// 8. 출력
System.out.println(iList); //[ , , , .]
// 9. 초기화 (모두 삭제)
iList.clear();
System.out.println(iList); // []
}
}